在MySQL中的分隔符之间搜索文本

时间:2008-09-29 17:08:28

标签: mysql

我正在尝试提取分隔符之间的列的某个部分。

e.g。在下面找到foo

测试'esf:foo:bar

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

11 个答案:

答案 0 :(得分:21)

在这里,你好了,芽:

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

是的,不知道你为什么要这样做,但这样做会有所帮助。

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

使用第一个':'的索引,从最后一个':'到字符串结尾的字符数,以及CHAR_LENGTH(不使用LENGTH() ),我们可以使用一点数学来发现两个':'实例之间字符串的长度。

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

同样,这很重要,但对每个人来说都是如此。

答案 1 :(得分:4)

如果两个分隔符仅在列中出现两次,则此方法应该有效。我正在做类似的事......

substring_index(substring_index(column,':',-2),':',1)

答案 2 :(得分:2)

LOCATEMID的组合可能会成功。

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

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

答案 3 :(得分:2)

我不知道你是否拥有这种权限,但是如果你必须进行这样的查询,那么可能需要重新规范你的表,并将这些值放在查找表中。

答案 4 :(得分:1)

只有一组分隔符,以下内容应该有效:

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

答案 5 :(得分:1)

mid(col, 
    locate('?m=',col) + char_length('?m='), 
    locate('&o=',col) - locate('?m=',col) - char_length('?m=') 
)

char_length(.)替换为数字3

,形式有点紧凑
mid(col, locate('?m=',col) + 3, locate('&o=',col) - locate('?m=',col) - 3)

我使用的模式是'?m=''&o'

答案 6 :(得分:0)

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

答案 7 :(得分:0)

如果您知道要从中提取的位置而不是数据本身的位置:

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

答案 8 :(得分:0)

这是我从中提取的内容(主要是冒号':'作为分隔符,但有一些例外),如表loadlineata255中的列theline255:

23856.409:0023:trace:message:SPY_EnterMessage (0x2003a) L"{#32769}"      [0081] WM_NCCREATE sent from self wp=00000000 lp=0023f0b0

这是MySql代码(它很快就做了我想要的,并且很直接):

select 
time('2000-01-01 00:00:00' + interval substring_index(theline255, '.', 1) second) as hhmmss
, substring_index(substring_index(theline255, ':', 1), '.', -1) as logMilli
, substring_index(substring_index(theline255, ':', 2), ':', -1) as logTid
, substring_index(substring_index(theline255, ':', 3), ':', -1) as logType
, substring_index(substring_index(theline255, ':', 4), ':', -1) as logArea
, substring_index(substring_index(theline255, ' ', 1), ':', -1) as logFunction
, substring(theline255, length(substring_index(theline255, ' ', 1)) + 2) as logText
from loaddata255

这就是结果:

# LogTime, LogTimeMilli, LogTid, LogType, LogArea, LogFunction, LogText
'06:37:36', '409', '0023', 'trace', 'message', 'SPY_EnterMessage', '(0x2003a) L\"{#32769}\"      [0081] WM_NCCREATE sent from self wp=00000000 lp=0023f0b0'

答案 9 :(得分:0)

这个对我来说很优雅。在第n个分隔符之后剥离所有,旋转字符串,在1.分隔符后旋转所有内容,然后向后旋转。

select
  reverse(
    substring_index(
      reverse(substring_index(str,separator,substrindex)),
      separator,
      1)
  );

例如:

select
  reverse(
    substring_index(
      reverse(substring_index('www.mysql.com','.',2)),
      '.',
      1
    )
  );

答案 10 :(得分:-2)

你可以在1命令

中使用substring / locate函数

这是一个老鼠教程:

http://infofreund.de/mysql-select-substring-2-different-delimiters/

描述他们应该寻找你的命令:

** SELECT substr(text,Locate(':',text)+ 2,Locate(':',text) - (Locate(':',text)+2))FROM testtable** < / p>

其中text是包含“test'esf:foo:bar”

的文本字段

所以foo可以是fooooo或fo - 长度无关紧要:)。