我在SQL Server数据库表的列中有以下字符串值:
CS-NO2-T6082 BROWN,STORAGE
CS-NO2-T6082 BROWN
CS-CT2N64045,POW REC X 2,ROCKER
CONSOLE,CS-CT2N74045,POW REC X 2
CS
CS,MAN REC
CS-T6082,POW REC X 2
CS-CT12N1176
CS-NO2-T6082 BROWN,SQUARE
CS-CT12N1176
CS-2T1176 GREY
我正在尝试仅在前面有'CS'的情况下检索值,但是有多种情况,如上面的示例所示。 “CS”可以单独显示,也可以用“ - ”分隔,然后用空格分隔。它可以在字符串的开头,中间或结尾。我想首先通过检查逗号来检查列中是否只有一个值,如果只有一个值并且它包含单词“CS”,那么它看起来很简单。但是当字符串两侧有多个值感兴趣时,就会出现问题。
我将非常感谢sql server中的任何建议或解决方案。
结果如下:
CS-NO2-T6082 BROWN
CS-NO2-T6082 BROWN
CS-CT2N64045
CS-CT2N74045
CS
CS
CS-T6082
CS-CT12N1176
CS-NO2-T6082 BROWN
CS-CT12N1176
CS-2T1176 GREY
感谢。
答案 0 :(得分:1)
您可以使用CHARINDEX
+ LEFT
字符串函数
CHARINDEX
- 帮助您确定第一次出现comma
&字符串
CS
SUBSTRING
- 将字符串从CS
提取到字符串中第一次出现的逗号
SELECT org_string,
Result_string = substring(org_string,pos,CASE WHEN Charindex(',', org_string,pos+1) <> 0 then Charindex(',', org_string,pos+1)-pos else len(org_string) end)
FROM ( VALUES ('CS-NO2-T6082 BROWN,STORAGE' ),
('CS-NO2-T6082 BROWN' ),
('CS-CT2N64045,POW REC X 2,ROCKER' ),
('CONSOLE,CS-CT2N74045,POW REC X 2' ),
('CS' ),
('CS,MAN REC' ),
('CS-T6082,POW REC X 2' ),
('CS-CT12N1176' ),
('CS-NO2-T6082 BROWN,SQUARE' ),
('CS-CT12N1176' ),
('CS-2T1176 GREY')) cs (org_string)
cross apply (values (charindex('CS',org_string))) p (pos)
结果:
╔══════════════════════════════════╦════════════════════╗
║ org_string ║ Result_string ║
╠══════════════════════════════════╬════════════════════╣
║ CS-NO2-T6082 BROWN,STORAGE ║ CS-NO2-T6082 BROWN ║
║ CS-NO2-T6082 BROWN ║ CS-NO2-T6082 BROWN ║
║ CS-CT2N64045,POW REC X 2,ROCKER ║ CS-CT2N64045 ║
║ CONSOLE,CS-CT2N74045,POW REC X 2 ║ CS-CT2N74045 ║
║ CS ║ CS ║
║ CS,MAN REC ║ CS ║
║ CS-T6082,POW REC X 2 ║ CS-T6082 ║
║ CS-CT12N1176 ║ CS-CT12N1176 ║
║ CS-NO2-T6082 BROWN,SQUARE ║ CS-NO2-T6082 BROWN ║
║ CS-CT12N1176 ║ CS-CT12N1176 ║
║ CS-2T1176 GREY ║ CS-2T1176 GREY ║
╚══════════════════════════════════╩════════════════════╝
答案 1 :(得分:1)
你可以在2次传球中完成。第一个寻找'CS-'或'CS'。第二个查找逗号并仅返回它之前的文本(如果没有任何逗号,则返回整个字符串)。
SELECT CASE WHEN CHARINDEX(',',Result1)>0 THEN LEFT(Result1,CHARINDEX(',',Result1)-1)
ELSE Result1
END AS FinalResult
FROM
(SELECT CASE WHEN CHARINDEX('CS-',[Orig_String])>0 THEN SUBSTRING([Orig_String],CHARINDEX('CS-',[Orig_String]), LEN([Orig_String]))
ELSE [Orig_String]
END AS Result1
FROM [Table1]) AS T
答案 2 :(得分:1)
有趣的业务需求,在脚本下面测试这几乎可以解决您的问题。
SELECT CASE WHEN CHARINDEX(',',ColName) = 0 THEN ColName
WHEN CHARINDEX('CS',ColName) < CHARINDEX(',',ColName) THEN LEFT(ColName,CHARINDEX(',',ColName)-1)
WHEN CHARINDEX('CS',ColName) > CHARINDEX(',',ColName) THEN PARSENAME(REPLACE(ColName,',','.'),2)
END
From TableName