问题描述
LEN(Column)-len(Replace(Column,'|','')
将给出 sql Server 的单行数据中可用的管道总数。
但是我需要计算紧跟在 Number 后面的 Pipe Symbol 的记录数,
**Eg 1:** MNY-THY-**2|** *YUI_WER-NA|JIU-ERT-**8|***
以上记录的输出为2。
**Eg 2:** *MNY-YU-NA|*
输出为0
**Eg 3:** *MNY-9876**5|***
输出为1
根据建议的答案更新我的问题:
**Eg 4:** MNY-YU-1234
输出为0 因为没有'|'我的例子4中的符号,结果应该只有0。
任何建议都将得到高度支持。
解决方法
如果您使用的是 SQL Server 2016+,STRING_SPLIT()
是一个选项:
表格:
SELECT *
INTO Data
FROM (VALUES
('MNY-THY-2| YUI_WER-NA|JIU-ERT-8|'),('MNY-YU-NA|'),('MNY-98765|'),('FGL_NU_0003')
) v (TextData)
声明:
SELECT *
FROM Data d
OUTER APPLY (
SELECT COUNT(*) AS NumberCount
FROM STRING_SPLIT(d.TextData,'|') s
WHERE (d.TextData LIKE '%|%') AND (RIGHT(s.[value],1) LIKE '[0-9]')
) a
结果:
TextData NumberCount
MNY-THY-2| YUI_WER-NA|JIU-ERT-8| 2
MNY-YU-NA| 0
MNY-98765| 1
FGL_NU_0003 0
,
您可以根据“|”拆分字符串并检查右侧的值是否包含数字。
DECLARE @tosearch VARCHAR(MAX)='%[0-9]|%',@string VARCHAR(MAX)='FGL_NU_0003'
SELECT COUNT(CASE WHEN RIGHT(VALUE,1) LIKE '[0-9]' THEN 1 ELSE NULL END)
FROM STRING_SPLIT(@string,'|')
WHERE @string LIKE '%|%'
预期输出:
MNY-YU-1234 - 0