我遇到了一个问题,似乎无法在任何地方找到正确的解决方案。我想从一个永远不会是相同长度的列中提取数据,但总是在括号中。我尝试过不同的SUBSTR和LOCATE语句无济于事。
表:数字日志
|UpdateDate| |Description|
|2014-01-01| |(10.0.600.1) Various descriptions follow|
|2014-01-02| |(192.168.10.100) Various descriptions follow|
我需要能够提取(创建一个新的表/字段)包含括号内的IP地址,正如我所说,它们将始终是不同的长度。
答案 0 :(得分:1)
您可以使用正则表达式执行此操作。但是,如果字符串中只有一个括号表达式,这应该对你有用:
select substring_index(substring_index(description, ')', 1), '(', -1) as IpAddress
答案 1 :(得分:1)
你可以使用LOCATE和SUBSTR完成整个事情。由于SUBSTR如何占据位置和长度,数学变得有点时髦。希望这个例子清楚地表明:
SELECT
SUBSTR(text, ip_start, ip_len) AS ip_addr
FROM
(
SELECT text,
(LOCATE('(', text) + 1) AS ip_start,
(LOCATE(')', text) - (LOCATE('(', text) + 1)) AS ip_len
FROM test
) temp;
请注意,(LOCATE('(', text) + 1)
会重复出现。 + 1
是我们不在子字符串中包含括号
ip_len
的实际计算为ip_len = end_paren_pos - ip_start
,但我们无法在同一查询中创建和选择ip_start
。