在括号内提取始终不同长度的数据

时间:2014-06-26 15:10:52

标签: mysql sql substring

我遇到了一个问题,似乎无法在任何地方找到正确的解决方案。我想从一个永远不会是相同长度的列中提取数据,但总是在括号中。我尝试过不同的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地址,正如我所说,它们将始终是不同的长度。

2 个答案:

答案 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

行动中的示例:http://sqlfiddle.com/#!2/2845e/3