Charindex,从字符串中获取特定数据

San*_*ndy 5 t-sql sql-server-2012

您好,我对 charindex 非常陌生,并尝试创建一个查询来提取我需要的信息,但遇到了错误。我在 stackexchange 以及其他一些网站上搜索了类似的问题,但似乎我仍然无法完全掌握这个概念来获得我需要的东西。

我最大的问题是我在列中的数据不是任何固定模式。我发现了一个 stackexchange question 回答了这个问题,但我的设置有点不同。以下是列 descr 和表工具的一些示例:

ID | Descr |
21 | Playhouse, Virginia Series, 98 Stage, PSDD, House|
35 | Playhouse, Virginia Series, 111 Stage, Inconel|
53 | Playhouse, FX Series, 125 Stage, House F31|
76 | FX Series, 134 Stage, F31, Onconel|
Run Code Online (Sandbox Code Playgroud)

多一点信息。在我要查找的数字之前应该总是有一个逗号。我发现千分之一的情况并非如此,但为了使这更容易,我们将假设它总是有一个前导逗号和空格。我要查找的数字可以是两位或三位。它也总是后跟一个空格和单词 stage。

这是我尝试但收到并出错的内容:选择

with cterecords(descr, position) as
(
    select
        descr, charindex(',', descr) position
        from facility
)
    select
        substring(descr, position +1,
        charindex('stage', descr,position) - position -1)
    from cterecords;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:消息 537,级别 16,状态 3,行 1 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

但是如果我解决了错误,我不确定我是否编写了查询来获得我想要的。

这是带有测试数据的SQL FiddleSQL Fiddle Example Data

Sab*_*n B 5

我使用charIndexpatIndex解决它。

CASE WHEN PatIndex('%, [0-9][0-9]% Stage%',Descr) > 0 
    AND LEN(SUBSTRING(Descr,1,CharIndex(' Stage', Descr)-1))>=3
    THEN RIGHT(SUBSTRING(Descr,1,CharIndex(' Stage', Descr)-1),3) 
    ELSE NULL END
    AS NewNo,   
CASE WHEN PatIndex('%, [0-9][0-9]% Stage%',Descr) > 0 
    AND LEN(SUBSTRING(Descr,1,CharIndex(' Stage', Descr)-1))>=3
    THEN SUBSTRING(Descr, PatIndex('%, [0-9][0-9]% Stage%',Descr)+2,3)
    ELSE NULL END
    AS NewNo2   
Run Code Online (Sandbox Code Playgroud)

随着输出:

NewNo NewNo2
----- ------
 98   98 
111   111
125   125
134   134
Run Code Online (Sandbox Code Playgroud)

关于它的一些解释:我曾经CharIndex(' Stage', Descr)在开始时找到位置' Stage'
然后我使用SUBSTRING(Descr,1,CharIndex(' Stage', Descr)-1)剪切文本,以便您的号码位于正确的部分。(像这样Playhouse, Virginia Series, 98:)。然后您可以使用不同的技术(right,another charIndex, reverse)来获取数字。