在字符串SQL Server中选择两个字符之间的值

时间:2017-07-21 10:16:45

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

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

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

这允许我在|之前放置所有内容进入column1,以及进入第3列的所有内容。 我需要尝试将所有内容放在值'|'之间和'/'进入column2

我很难得到

   ,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栏,

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

非常感谢任何帮助。

使用 Microsoft SQL Server 2012(SP3)

2 个答案:

答案 0 :(得分:0)

如果每个逗号之间总是三个单词且单词不超过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 

答案 1 :(得分:0)

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

onDestroy()

由于反馈而编辑:

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