我需要将一列分为3个不同的部分

时间:2019-02-14 14:43:30

标签: sql sql-server

我有一个返回的列,它是由连字符分隔的一个字符串。

我需要将其分为2个不同的列以代表“类型”和“主机名”

我当前专栏中的2个示例是-

  Wordhere - Drive Space Low - HOSTNAMEHERE - Failure

  Wordhere - Drive Space Low - Server- HOSTNAMEHERE - Failure

我尝试了许多不同的SUBSTRING组合,但都无济于事,所以我希望这里的人能指出正确的方向。

因此,我需要从上述示例中提取的列是类型,分别是“ Drive Space Low”和“ Drive Space Low-Server”部分,然后是“ HOSTNAME”部分的主机名。

如果有帮助,这些用户当前所在的列名称为“服务”。

谢谢:-)

3 个答案:

答案 0 :(得分:1)

如果您使用的是SQL2016及更高版本,则可以使用STRING_SPLIT

SELECT value
FROM HostInfo
CROSS APPLY STRING_SPLIT(HOSTDETAIL, '-')
GO

答案 1 :(得分:1)

您要搜索的字符串包含连字符,因此您可以提取第一个和倒数第二个连字符之间以及倒数第二个和倒数第二个之间的部分:

WITH tests(str) AS (
    SELECT 'Wordhere - Drive Space Low - HOSTNAMEHERE - Failure' UNION
    SELECT 'Wordhere - Drive Space Low - Server - HOSTNAMEHERE - Failure'
)
SELECT str
     , SUBSTRING(str, pos1 + 1, pos2 - pos1 - 1) AS Message
     , SUBSTRING(str, pos2 + 1, pos3 - pos2 - 1) AS Hostname
FROM tests
CROSS APPLY (
    SELECT CHARINDEX('-', str) AS pos1
         , LEN(str) - CHARINDEX('-', REVERSE(str)) + 1 AS pos3
         , LEN(str) - CHARINDEX('-', REVERSE(str), CHARINDEX('-', REVERSE(str)) + 1) + 1 AS pos2
) AS ca

答案 2 :(得分:1)

一种简单的XML方法将在这里工作。该解决方案将从分隔的字符串中分离出值,并且可跨SQL版本工作,该解决方案可解决驱动器空间不一致的问题-服务器问题:

 SELECT
 col1 = convert(xml,'<x>'+replace(replace([Service],'Drive Space Low - ','Drive Space Low '),'-','</x><x>')+'</x>').value('/x[2]','varchar(100)'),
 col2 = convert(xml,'<x>'+replace(replace([Service],'Drive Space Low - ','Drive Space Low '),'-','</x><x>')+'</x>').value('/x[3]','varchar(100)')
 FROM YOURTABLE