2016-03-17 45 views
-1

如何我可以選擇SQL服務器:選擇後的特定字符的所有

  • 「ALT1」 如果值是 「W61N03D20V0-WHIH-ALT1」
  • 「ALT2」 如果 「W61N03D20V0-WHIH-ALT2」
  • 「SW」 爲 「W61N03D20V0-WHIH-SW」
  • 「默認」 爲 「W61N26D1YA1-VICU」(不前綴)
  • 「Defailt」 爲 「W61N27D21V2-AZTD」

換句話說,我正在尋找第二個後綴後一種方式提取物最後一部分,但如果我have't第二後綴 - 再違約

感謝意見

+0

邏輯不太清楚。你能詳細說明嗎? –

+0

@ZoharPeled,我認爲它應該總是帶有負連接字符串的第三部分。 – Shnugo

+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]

+0

奇妙的是它真的有用! –

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 
+0

我不認爲,有趣數據之前的部分總是「-WHIH-」......但這是OP應該清除的東西。 – Shnugo

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 
0

使用可以使用CASE表達式來檢查字符串是否與W61N03D20V0-WHIH開始。
如果它以RIGHT,REVERSECHARINDEX的組合作爲起始字符串,則返回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

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