我有一個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
我有一個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
你可以把它在一個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
試試這個:
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)
它看起來像你的列實際上不是一個單一的數據元素,但已經被連接在一起的多個數據元素。數據庫設計的一個壞主意,這會導致你現在遇到的問題。
這應該給你你需要的東西,但是強烈考慮將列分隔成所需的部分。
SELECT
SUBSTRING(id, CHARINDEX('-', id) + 1, LEN(id) - CHARINDEX('(', REVERSE(id)) - CHARINDEX('-', id))
FROM
My_Table
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
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
首先,它會檢查是否「( 「是否存在 如果存在,則它將從」 - 「到」(「)的位置之前。否則它會從「 - 」的下一個位置讀取數據直到結束。
如果重要,我強烈建議單獨存儲該部分。解析很混亂,這甚至不處理所有可能的問題(例如,沒有破折號):'SELECT SUBSTRING(ID, CHARINDEX(' - ',ID)+ 1, CHARINDEX('(',ID +'( ')-1-CHARINDEX(' - ',ID))FROM ...;' –