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 Fiddle:SQL Fiddle Example Data
我使用charIndex
并patIndex
解决它。
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
)来获取数字。
归档时间: |
|
查看次数: |
2476 次 |
最近记录: |