在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)";