【问题标题】:Select value between two characters in string SQL server在字符串 SQL Server 中的两个字符之间选择值
【发布时间】:2017-12-27 08:28:46
【问题描述】:

我有一个很大的字符串值,我希望将其放入数据库中。我有当前的代码可以做到这一点。

DECLARE @Value NVARCHAR(max) = {status}
DECLARE @DYVALUE TABLE (VALUE NVARCHAR(MAX))
INSERT INTO @DYVALUE (value)
SELECT @VALUE
;WITH cte
AS (
SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value
FROM (
    SELECT CAST('<S>' + REPLACE(Value, ',', '</S><S>') + '</S>' AS XML) AS Value
    FROM @DyValue
    ) AS A
CROSS APPLY Value.nodes('/S') AS Split(a)
)

 insert into mytable
 SELECT *
 FROM (
SELECT replace(LTRIM(SUBSTRING(Value, 0, CHARINDEX('|', value))),' ','') AS col1
    ,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [col2]
    ,SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS [col3]

FROM Cte
) dt

这使我可以将所有内容放在 |进入第 1 列,然后 / 进入第 3 列。 我需要尝试将所有内容放在值“|”之间和 '/' 进入第 2 列

我很难得到

   ,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [col2]

只取两个字符之间的值。

将运行的字符串类型的示例是

1234567890|再见残酷的世界/我应该在第3栏, 2345678901|再见残酷的世界/我应该在第3栏, 3456789012|再见残酷的世界/请把我放在第3栏, 3456789012|再见残酷的世界/请把我在第 3 列,6324589657|你好世界/我需要在第 3 列,1145698763|再见残酷世界/我应该在第 3 列,36985214728|再见残酷世界/我应该在第 3 列,7412589635|再见残酷世界/我应该在第 3 栏 7412589635|再见残酷的世界/我应该在第 3 栏 6398756951|请帮助我/请把我放在第 3 栏,

字符串将采用该格式,我刚刚将值更改为更有趣的内容。

任何帮助将不胜感激。

使用 微软 SQL Server 2012 (SP3)

【问题讨论】:

    标签: sql sql-server sql-server-2012 substring charindex


    【解决方案1】:

    如果每个逗号之间总是三个单词并且单词不超过 128 个字符,则使用PARSENAME

    ;WITH cte
         AS (SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value
             FROM   (SELECT Cast('<S>' + Replace(Value, ',', '</S><S>') + '</S>' AS XML) AS Value
                     FROM   @DyValue) AS A
                    CROSS APPLY Value.nodes('/S') AS Split(a))
    SELECT Parsename(string, 3),
           Parsename(string, 2),
           Parsename(string, 1)
    FROM   (SELECT Replace(Replace(value, '|', '.'), '/', '.') string
            FROM   cte)a 
    

    另一种方式,适用于任意数量的字符

    WITH cte
         AS (SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value
             FROM   (SELECT Cast('<S>' + Replace(Value, ',', '</S><S>') + '</S>' AS XML) AS Value
                     FROM   @DyValue) AS A
                    CROSS APPLY Value.nodes('/S') AS Split(a))
    SELECT LEFT(value, Charindex('|', value) - 1),
           Substring(value, Charindex('|', value) + 1, Charindex('/', value) - Charindex('|', value) - 1),
           Substring(value, Charindex('/', value) + 1, Len(value))
    FROM   cte 
    

    【讨论】:

    • 我希望永远是三个字,字数会有所不同,抱歉。
    • @Phil - 这是一个例子……现在检查
    • 与上面的答案类似,我在尝试运行时收到错误“传递给 LEFT 或 SUBSTRING 函数的长度参数无效”
    • @Phil - 在字符串的末尾有一个不需要的逗号.. 删除它并检查
    【解决方案2】:

    如果我正确理解了这个问题,这可能是一个解决方案:

    SELECT 
    SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS column1,
    SUBSTRING(Value, CHARINDEX('|', Value) + 1, CHARINDEX('/', Value) 
        - CHARINDEX('|', Value) - 1) AS column2,
    SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS column3
    

    根据反馈进行编辑:

    SELECT 
    SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS column1,
    SUBSTRING(Value, CHARINDEX('|', Value) + 1, 
        CHARINDEX('/', Value) - CHARINDEX('|', Value) - 1) AS column2,
    SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value) - CHARINDEX('/', Value)) AS column3
    

    【讨论】:

    • 即使我不尝试将这些插入数据库,我也会收到错误“传递给 LEFT 或 SUBSTRING 函数的长度参数无效”
    • @Phil:嗯,这很奇怪。对我来说,它正在工作。我编辑了答案以更改 LEN 部分。也许这有帮助......
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2020-06-25
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多