SQL Server:选择特定字符后的所有内容

时间:2016-03-17 13:18:51

标签: sql-server tsql

我如何选择

  • " ALT1"如果值为" W61N03D20V0-WHIH-ALT1"
  • " ALT2"如果用于" W61N03D20V0-WHIH-ALT2"
  • " SW" for" W61N03D20V0-WHIH-SW"
  • "默认" for" W61N26D1YA1-VICU" (没有前缀)
  • " Defailt" for" W61N27D21V2-AZTD"

换句话说,我正在寻找一种方法在第二个后缀之后提取最后一个部分,但如果我有第二个后缀 - 那么默认

感谢您的建议

5 个答案:

答案 0 :(得分:2)

试试这样:

首先你"分裂"带有XML技巧的减号上的字符串。 然后你从XML读取第三个节点 - 瞧!

CREATE TABLE #tbl(content VARCHAR(100));
INSERT INTO #tbl VALUES('W61N03D20V0-WHIH-ALT1')
                      ,('W61N03D20V0-WHIH-SW')
                      ,('W61N26D1YA1-VICU');

WITH SplittedAsXml AS
(
    SELECT CAST('<x>' + REPLACE(content,'-','</x><x>') + '</x>' AS XML) AS Content
    FROM #tbl
)
SELECT ISNULL(Content.value('/x[3]','varchar(max)'),'default') AS TheThirdPart
FROM SplittedAsXml;

DROP TABLE #tbl;

结果

ALT1
SW
default

通过这种方式也可以让您有机会一次性查询其他部分,只需查询/x[1]/x[2]

答案 1 :(得分:1)

我是使用内置的substring()函数完成的:

declare @str VARCHAR(40) = 'W61N03D20V0-WHIH-ALT1'  -- also works for the other examples
declare @sep VARCHAR(1)  = '-'

declare @middleToEnd VARCHAR(40) = substring(@str, charindex(@sep, @str) + 1, len(@str))

declare @pos INT = charindex(@sep, @middleToEnd)    
declare @lastPart VARCHAR(40) = 
   CASE WHEN @pos = 0
   THEN 'Default'
   ELSE substring(@middleToEnd, @pos + 1, len(@middleToEnd))
   END

select @lastPart

答案 2 :(得分:1)

为了获得最佳性能,您可以使用此单线程解决此问题(计算为一行)

SELECT 
  COALESCE(STUFF(col,1,NULLIF(CHARINDEX('-',col, CHARINDEX('-',col)+1), 0),''),'Default')
FROM (values
  ('W61N03D20V0-WHIH-ALT1'),('W61N03D20V0-WHIH-ALT2'),
  ('W61N03D20V0-WHIH-SW'),('W61N26D1YA1-VICU'),
  ('W61N27D21V2-AZTD')) x(col)

结果:

ALT1
ALT2
SW
Default
Default

答案 3 :(得分:0)

如果我了解您的要求,以下内容可满足您的需求:

-- fake table
WITH SomeTable AS (
    SELECT 'W61N03D20V0-WHIH-ALT1' AS Field1
    UNION ALL
    SELECT 'W61N03D20V0-WHIH-SW' 
    UNION ALL
    SELECT 'W61N26D1YA1-VICU'
)

-- select
SELECT 
    CASE CHARINDEX('-WHIH-', Field1)
        WHEN 0 THEN 'Default'
        ELSE SUBSTRING(Field1, CHARINDEX('-WHIH-', Field1) + 6, LEN(Field1) - (CHARINDEX('-WHIH-', Field1) + 5))
    END 
FROM SomeTable

答案 4 :(得分:0)

使用可以使用CASE表达式来检查字符串是否以W61N03D20V0-WHIH开头 如果以它开头,请使用RIGHTREVERSECHARINDEX函数的组合来获取字符串的最后一部分,否则Default

<强>查询

select case when [your_column_name] like 'W61N03D20V0-WHIH%' 
        then right([your_column_name], charindex('-', reverse([your_column_name]), 1) -  1)
        else 'Default' end as new_column_name
from your_table_name;

<强> SQl Fiddle demo