我正在尝试提取分隔符之间的列的某个部分。
e.g。在下面找到foo
测试'esf:foo:bar
所以在上面我想要返回foo,但是所有的regexp函数只返回true | false, 有没有办法在MySQL中做到这一点
答案 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)
如果值“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 - 长度无关紧要:)。