2016-04-26 42 views
2

我有一個ID爲col的表A.下面是樣本數據 -如何在SQL SERVER中的兩個不同符號之前和之後有條件地使用子字符串

ID 
NT-QR-1499-1(2015) 
NT-XYZ-1503-1 
NT-RET-546-1(2014) 

,我需要選擇一切後,第一個「 - 」左和前「(」從右邊然而,有些紀錄沒有「(」,在這種情況下,第二。條件將不適用

以下是我所需要的 -

QR-1499-1 
XYZ-1503-1 
RET-546-1 
+3

如果重要,我強烈建議單獨存儲該部分。解析很混亂,這甚至不處理所有可能的問題(例如,沒有破折號):'SELECT SUBSTRING(ID, CHARINDEX(' - ',ID)+ 1, CHARINDEX('(',ID +'( ')-1-CHARINDEX(' - ',ID))FROM ...;' –

回答

2

你可以把它在一個CASE語句來完成,雖然我一定會亞倫接受任何忠告。

CREATE TABLE #TestData (ID nvarchar(50)) 

INSERT INTO #TestData (ID) 
VALUES 
('NT-QR-1499-1(2015)') 
,('NT-XYZ-1503-1') 
,('NT-RET-546-1(2014)') 

SELECT 
ID 
,CASE 
    WHEN CHARINDEX('(',ID) = 0 
     THEN RIGHT(ID, LEN(ID)-CHARINDEX('-',ID)) 
    ELSE LEFT(RIGHT(ID, LEN(ID)-CHARINDEX('-',ID)),CHARINDEX('(',RIGHT(ID, LEN(ID)-CHARINDEX('-',ID)))-1) 
END Result 
FROM #TestData 
1

試試這個:

SELECT y.i, SUBSTRING(ID, x.i + 1, IIF(y.i = 0, LEN(ID), y.i - x.i - 1)) 
FROM mytable 
CROSS APPLY (SELECT CHARINDEX('-', ID)) AS x(i) 
CROSS APPLY (SELECT CHARINDEX('(', ID)) AS y(i) 
1

它看起來像你的列實際上不是一個單一的數據元素,但已經被連接在一起的多個數據元素。數據庫設計的一個壞主意,這會導致你現在遇到的問題。

這應該給你你需要的東西,但是強烈考慮將列分隔成所需的部分。

SELECT 
    SUBSTRING(id, CHARINDEX('-', id) + 1, LEN(id) - CHARINDEX('(', REVERSE(id)) - CHARINDEX('-', id)) 
FROM 
    My_Table 
1
DECLARE @str varchar(64); 
DECLARE @start int; 
DECLARE @length int; 
SELECT @str = 'NT-QR-1499-1(2015)'; 
/*SELECT @str = 'NT-XYZ-1503-1';*/ 

SELECT @start = CHARINDEX('-', @str) + 1; 
SELECT @length = CHARINDEX('(', @str) - @start; 
IF (@length > 0) 
    SELECT SUBSTRING(@str, @start, @length) 
ELSE 
    SELECT SUBSTRING(@str, @start, LEN(@str)) 
GO 
1

SELECT CASE WHEN CHARINDEX( '(',ID)> 0 THEN SUBSTRING (ID,CHARINDEX( ' - ',ID)1,(CHARINDEX( '(',ID )-CHARINDEX( ' - ',ID)-1)) ELSE SUBSTRING(ID,CHARINDEX( ' - ',ID)+1) END AS New_Column_Name FROM TABLE_NAME

首先,它會檢查是否「( 「是否存在 如果存在,則它將從」 - 「到」(「)的位置之前。否則它會從「 - 」的下一個位置讀取數據直到結束。

相關問題