SQL:如何在特定模式之间提取子字符串?

时间:2017-05-26 06:12:42

标签: sql-server string ssms

我在Microsoft SQL server management studio中有如下字符串

A,5000; B,的 3000 ; LC,3000

我需要提取'; LC'之前的值。在字符串的第二个逗号之后。

在上面的示例中,我的子字符串应该为3000(这是期望的结果)。

我已将PATINDEX函数识别为解决方案的一部分,但无法弄清楚如何识别字符串的第二个逗号。

5 个答案:

答案 0 :(得分:1)

不优雅且长期的解决方案是使用PATHINDEX,REVERSE和SUBSTRING函数:

SELECT 
    REVERSE(
        SUBSTRING(
            REVERSE(SUBSTRING([column],0,PATINDEX('%;LC%',[column]))),
            0,
            PATINDEX('%,%',REVERSE(SUBSTRING([column],0,PATINDEX('%;LC%',[column])))))
    )
    from [table]

答案 1 :(得分:0)

您可以使用交叉申请:

select substring(myColumn, p4.Pos + 1, P2.Pos - p4.Pos - 1) Before2nd
from myTable
  cross apply (select (charindex(';', myColumn))) as P1(Pos)
  cross apply (select (charindex(';', myColumn, P1.Pos+1))) as P2(Pos)
  cross apply (select (charindex(',', myColumn))) as P3(Pos)
  cross apply (select (charindex(',', myColumn, P3.Pos+1))) as P4(Pos)

答案 2 :(得分:0)

请使用" / XMLRoot / RowData"如下例:

DECLARE @StringList NVARCHAR(MAX) SET @StringList =' A,5000; B,3000; LC,3000'    --INSERT INTO TABLEName(col) SELECT LTRIM(RTRIM(mnvalue('。[1]',' varchar(8000)')))AS OutPutList FROM(SELECT CAST('&#39) ; + REPLACE(@StringList,',''')+'' AS XML)AS t        )tbl CROSS APPLY t.nodes(' / XMLRoot / RowData')m(n)

答案 3 :(得分:0)

要查找字符串的倒数第二个逗号,可以使用REVERSE()函数。

尝试以下解决方案:

DECLARE @String VARCHAR(100)='A,5000;B,3000;LC,3000'

SELECT REVERSE(SUBSTRING(REVERSE(@String),CHARINDEX(';',REVERSE(@String))+1,CHARINDEX(',',REVERSE(@String),CHARINDEX(';',REVERSE(@String)))-CHARINDEX(';',REVERSE(@String))-1))

答案 4 :(得分:0)

Exception in thread "main" java.lang.NoClassDefFoundError: org/greenrobot/greendao/generator/Schema
    at com.example.MainGenerator.main(MainGenerator.java:12)
Caused by: java.lang.ClassNotFoundException: org.greenrobot.greendao.generator.Schema
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more