从MySQL中的字符串中提取特定模式:

时间:2014-09-25 17:56:51

标签: mysql

我想从MySQL中的字符串中提取特定模式。

该列包含特定字符串,如xxx-atg168d和xxx-atg444-6x。从这些字符串中,我只想提取atg168和atg444。我怎样才能在MySQL中执行此操作?

**Input_column**  
xxx-atg168d  
xxx-atg444-6x  
xxx-atg1689d   
xxx-atg16507d  
xxx-atg444d-6x 
xxx-atg444c-6x  

**Output_column**  
atg168  
atg444  
atg1689  
atg16507  
atg444
atg444

3 个答案:

答案 0 :(得分:1)

这样的事情可能符合您的规范:

SUBSTRING_INDEX(SUBSTR( t.col ,INSTR( t.col ,'-')+1),'-',1)

这假定您要返回第一个短划线字符后面的字符串部分,直到下一个短划线字符(如果存在)。如果字符串中不存在短划线字符,则将返回整个字符串。

修改

糟糕!该表达式还包括尾随" d"。如果它只是一个尾随" d"需要删除的角色......

TRIM(TRAILING 'd' FROM SUBSTRING_INDEX(SUBSTR( t.col ,INSTR( t.col ,'-')+1),'-',1))

在更一般的情况下,删除任何"非数字"从最后的角色(不只是" d"),事情变得相当难看。我们需要检查最右边的字符,看看它是否与我们要保留的字符匹配。如果不是,我们将字符串缩短一个字符。

IF( INSTR('0123456789',RIGHT(
       @t := SUBSTRING_INDEX(SUBSTR( t.col ,INSTR( t.col ,'-')+1),'-',1)
    ,1))
, @t
, SUBSTRING( @t, 1, CHAR_LENGTH( @t )-1)
)

我在这里使用了一个用户定义的变量,以避免多次重复相同的表达式。我们不要求这样做。可以删除@t :=分配,并且可以使用分配给@t的表达式替换其他@t分配。

该表达式中的文字'0123456789'是我们不想从字符串末尾删除的字符集。

答案 1 :(得分:0)

使用SUBSTRING功能,如下所示:

select SUBSTRING(column_name ,5,6) from table_name;

这里5是起始位置,6是从字符串中提取的子串的长度。

答案 2 :(得分:0)

感谢斯宾塞提出您的建议。我编辑了你的代码以获得我的查询的解决方案。这是更新查询,

left(substring_index (substr(subid,instr(subid,'-')+1),'-',1) , char_length(substring_index (substr(subid,instr(subid,'-')+1),'-',1))-1)