在MySQL中的定界符之间搜索文本

时间:2020-03-06 14:53:08  来源:igfitidea点击:

我试图提取定界符之间的列的特定部分。

例如在下面找到foo

测试'esf:foo:bar

所以在上面我想返回foo,但是所有的regexp函数只返回true | false,
有没有办法在MySQL中做到这一点

解决方案

LOCATE和MID的组合可能会解决问题。

如果值" test'esf:foo:bar"位于字段fooField中:

MID( fooField, LOCATE('foo', fooField), 3);

我不知道我们是否具有这种权限,但是如果我们必须执行这样的查询,则可能是时候重新规范化表,并将这些值存储在查找表中了。

select mid(col from locate(':',col) + 1 for 
locate(':',col,locate(':',col)+1)-locate(':',col) - 1 ) 
from table where col rlike ':.*:';

芽,这是你去的:

SELECT 
  SUBSTR(column, 
    LOCATE(':',column)+1, 
      (CHAR_LENGTH(column) - LOCATE(':',REVERSE(column)) - LOCATE(':',column))) 
FROM table

是的,不知道为什么要这样做,但这可以解决问题。

通过执行LOCATE,我们可以找到第一个':'。要找到最后一个':',没有反向LOCATE,因此我们必须通过执行LOCATE(':',REVERSE(column))来手动完成。

有了第一个':'的索引,从最后一个':'到字符串末尾的字符数,以及CHAR_LENGTH(请勿使用LENGTH()),我们可以使用一些数学运算来发现两个':'实例之间的字符串的长度。

这样,我们可以执行一个SUBSTR并动态地抽取两个':'之间的字符。

再次,这很麻烦,但对每个人来说都是如此。

仅使用一组定额计,以下工作:

SUBSTR(
    SUBSTR(fooField,LOCATE(':',fooField)+1),
    1,
    LOCATE(':',SUBSTR(fooField,LOCATE(':',fooField)+1))-1
 )

如果我们知道要提取的位置,而不是数据本身是什么:

$colNumber = 2; //2nd position
$sql = "REPLACE(SUBSTRING(SUBSTRING_INDEX(fooField, ':', $colNumber),
                             LENGTH(SUBSTRING_INDEX(fooField, 
                                                    ':', 
                                                    $colNumber - 1)) + 1)";