我想从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
答案 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)