从sql服务器中的字符串中提取子字符串

时间:2021-02-04 19:35:11

I have the following string values in a column within a SQL server database table:

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

I am trying to retrieve values only when it is preceded by 'CS' but there are multiple cases as shown in above examples. 'CS' may appear on it's own or with number separated by '-' and then a color separated by a space. It can be in the beginning of a string, in the middle or at the end. I want to first check if there is only one value in the column by checking for a comma, if there is only one value and it contains the word 'CS' then it looks simple. But when there are multiple values on either side of the string interested in then it becomes a problem.

我只在值前面加上“CS”时才尝试检索值,但是上面的示例中显示了多种情况。“CS”可以单独出现,也可以用“-”分隔数字,然后用空格分隔颜色。它可以在字符串的开头,中间或者结尾。我首先要检查列中是否只有一个值,通过检查逗号,如果只有一个值,并且它包含单词“CS”,那么它看起来很简单。但是当字符串的两边都有多个值时,就会出现问题。

I will appreciate any suggestions or solutions in sql server please.

如果您对sql server有任何建议或解决方案,我将不胜感激。

The result should look like:

结果应该是:

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 

Thanks.

谢谢。

3 个解决方案

#1


1  

You can use CHARINDEX + LEFT string function

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

CHARINDEX - Helps you to identify the first occurrence of the comma & CS in the string

CHARINDEX—帮助您识别字符串中的逗号和CS的第一个出现。

SUBSTRING - Extract the string from CS to first occurrence of the comma in the string

子字符串——从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)

Result :

结果:

╔══════════════════════════════════╦════════════════════╗
║            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     ║
╚══════════════════════════════════╩════════════════════╝

#2


1  

You can do it in 2 passes. The first looks for the 'CS-' or 'CS'. The second looks for the comma and only returns the text before it (or the whole string if there isn't any comma).

你可以做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

#3


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

#1


1  

You can use CHARINDEX + LEFT string function

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

CHARINDEX - Helps you to identify the first occurrence of the comma & CS in the string

CHARINDEX—帮助您识别字符串中的逗号和CS的第一个出现。

SUBSTRING - Extract the string from CS to first occurrence of the comma in the string

子字符串——从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)

Result :

结果:

╔══════════════════════════════════╦════════════════════╗
║            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     ║
╚══════════════════════════════════╩════════════════════╝

#2


1  

You can do it in 2 passes. The first looks for the 'CS-' or 'CS'. The second looks for the comma and only returns the text before it (or the whole string if there isn't any comma).

你可以做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

#3


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