2

我在 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 

谢谢。

4

3 回答 3

1

您可以使用CHARINDEX+LEFT字符串函数

CHARINDEX- 帮助您识别字符串中comma&的第一次出现CS

SUBSTRINGCS- 从字符串中第一次出现逗号的位置提取字符串

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     ║
╚══════════════════════════════════╩════════════════════╝
于 2016-10-04T12:48:09.910 回答
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
于 2016-10-04T13:07:08.340 回答
1

Interesting business requirement, test below script this will almost solve your problem.

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
于 2016-10-04T13:13:30.490 回答