从SQL Server中的字符串中提取子字符串

时间:2018-01-10 10:54:19

标签: sql sql-server tsql

我需要从字符串中提取子字符串的一部分,如下所示。

YY_12.Yellow
ABC_WSA.Thisone_A
SS_4MON.DHHE_A_A

我需要按照以下提取字符串

Yellow
Thisone
DHHE

4 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

declare @tbl table (col nvarchar(100));
insert @tbl values ('YY_12.Yellow'), ('ABC_WSA.Thisone_A'), ('SS_4MON.DHHE_A_A')

select *
    , charindex('_', col2, 0)
    , left(col2, 
               case 
                   when charindex('_', col2, 0) - 1 > 0 
                       then charindex('_', col2, 0) - 1 
                   else len(col2) 
               end) [result]
from (
select col
    , substring(col, charindex('.', col, 0) + 1, len(col)) [col2]
from @tbl ) rs

我要留下完整的代码,以便您可以理解我的所作所为。

  1. 首先识别并删除点到#34;。" (在嵌套[col2]中的SELECT列)
  2. 然后我嵌套SELECT,这样我就可以更容易地在第一个SELECT的结果列上应用新逻辑,我只能将所有内容保留到下划线" _&#34 ;
  3. 最终结果存储在[result]

答案 1 :(得分:1)

试试这个:

CREATE TABLE app (info varchar(20))
INSERT INTO app VALUES
('YY_12.Yellow'),
('ABC_WSA.Thisone_A'),
('SS_4MON.DHHE_A_A'),
('testnopoint')

SELECT 
    CASE
        WHEN CHARINDEX('.', info) > 0 THEN 
        CASE 
            WHEN CHARINDEX('_', info, CHARINDEX('.', info) + 1) > 0 THEN
            SUBSTRING(info, CHARINDEX('.', info) + 1, CHARINDEX('_', info, CHARINDEX('.', info) + 1) - CHARINDEX('.', info) - 1)
            ELSE
            SUBSTRING(info, CHARINDEX('.', info) + 1, LEN(info))
         END
    END
FROM app

我的查询,如果.不存在,则返回NULL,如果要返回所有字符串,请删除CASE语句

继续SqlFiddle

答案 2 :(得分:1)

您还可以尝试使用 SQL Server 2012

中提供的parsename()功能
select Name, left(parsename(Name,1), 
                 case when charindex('_', parsename(Name,1)) > 0 
                      then charindex('_', parsename(Name,1))-1 
                      else len(parsename(Name,1)) 
                 end) [ExtrectedName] from table

这假设您的字符串中始终有.来在.

之后读取名称

结果:

Name              ExtrectedName
YY_12.Yellow      Yellow
ABC_WSA.Thisone_A Thisone
SS_4MON.DHHE_A_A  DHHE

答案 3 :(得分:1)

试试这个,在这里使用STUFF

SELECT  LEFT(STUFF(col,1,CHARINDEX('.',col),''),
                CHARINDEX('_',STUFF(col,1,CHARINDEX('.',col),'')+'_')-1
            )
FROM    @table

输出: -

Yellow
Thisone
DHHE