Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MySQL中的字符串中提取特定模式:_Mysql - Fatal编程技术网

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

从MySQL中的字符串中提取特定模式:,mysql,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 atg44

我想从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

使用子字符串函数,如下所示:

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

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

类似的内容可能符合您的规格:

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'
是我们不希望从字符串末尾删除的字符集

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

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

谢谢你的回复。目标字符串的长度不是常量。还有像xxx-atg1689d和xxx-atg16870dHi这样的记录,我试过这个方法。但我有一张像xxx-atg444d-6x这样的唱片。对于这个字符串,它返回atg444d。请建议我解决这个问题。@PyPerl:我在发布答案后注意到后面的“d”字符;我已经更新了我的答案,添加了一个TRIM()函数来删除尾随的“d”字符。您好,谢谢。和d一样,我还有其他尾随字符。我怎样才能将您的解决方案推广到任何角色?谢谢spencer的帮助。我编辑了您的代码以获得解决方案。