我得到了一个字符串表,看起来像这样:9; 1;测试;;11002年我怎么数A前面有多少个分号呢?
干杯!
使用字符串函数
select len(left(str,charindex(str,'A')) - len(replace(left(str,charindex(str,'A'), ';', '')) n
from tbl
提示:整个问题有一些气味…您不应该将数据存储为CSV字符串。但有时我们必须利用我们拥有的……
提示2:下面需要SQL-Server v2016。对于旧版本,我们需要基于XML做类似的事情。
试试这个:
——一个声明的表来模拟你的问题
DECLARE @tbl TABLE(ID INT IDENTITY, YourCSVstring VARCHAR(100));
INSERT INTO @tbl(YourCSVstring)
VALUES('9;1;test;A;11002');
——查询
SELECT t.ID
,A.*
FROM @tbl t
CROSS APPLY OPENJSON(CONCAT(N'["',REPLACE(t.YourCSVstring,';','","'),N'"]')) A;
简而言之:
- 我们使用一些替换将你的csv字符串转换为JSON数组。
- 现在我们可以使用use
OPENJSON()
来读取。 value
为数组项,key
为从零开始的索引。 按你需要的方式进行。
只是给您一些乐趣:您可以轻松地将CSV类型安全的读取为列,只需将[[
加倍并使用WITH
指定列:
SELECT t.ID
,A.*
FROM @tbl t
CROSS APPLY OPENJSON(CONCAT(N'[["',REPLACE(t.YourCSVstring,';','","'),N'"]]'))
WITH(FirstNumber INT '$[0]'
,SecondNumber INT '$[1]'
,SomeText NVARCHAR(100) '$[2]'
,YourLetterA NVARCHAR(100) '$[3]'
,FinalNumber INT '$[4]')A
的回报:
ID FirstNumber SecondNumber SomeText YourLetterA FinalNumber
1 9 1 test A 11002