2017-05-29 28 views
2

基本上我想要做的是我想要得到中間的單詞,使用第二次出現相同的字符(在這種情況下,破折號「 - 」)如何使用Substring通過Charindex的Second Position獲取中間詞?

這是樣品輸入:

declare @word nvarchar(max) 
set @word = 'Technical Materials - Conversion - Team Dashboard' 

上有這樣一句話三個部分,它們除以「 - 」虛線。

第一部分是「技術資料」,這我能夠用得到:

SELECT LTRIM(RTRIM(SUBSTRING(@word, 0, CHARINDEX('-', @word, 0)))) 

最後一組是「團隊儀表板」,這我能夠用得到:

SELECT CASE WHEN LEN(@word) - LEN(REPLACE(@word, '-', '')) = 1 
      THEN NULL 
     ELSE 
      RIGHT(@word,CHARINDEX('-', REVERSE(@word))-1) 
     END 

問題是,我很難得到這個例子中'轉換'的中間詞。

回答

2

如果格式固定,您可以使用PARSENAME達到您的期望:

DECLARE @Word AS NVARCHAR(MAX) = 'Technical Materials - Conversion - Team Dashboard' 
SELECT PARSENAME(REPLACE(@Word, '-', '.'), 2) 

,如果要修剪多餘的空格,那麼:

SELECT LTRIM(RTRIM(PARSENAME(REPLACE(@Word, '-', '.'), 2))) 
+0

如果格式是固定的,你是什麼意思?我的意思是這種代碼不起作用的格式? –

+1

他的意思是如果你總是有2' - '而不是''。在價值 – GuidoG

+0

我的意思是這裏的兩個破折號。查詢需要更改,如果它有少於/多於2破折號 – Arulkumar

2

嘗試此查詢:

SELECT 
    SUBSTRING(@word, 
       CHARINDEX('-', @word) + 2, 
       CHARINDEX('-', @word, CHARINDEX('-', @word) + 1) - 
        CHARINDEX('-', @word) - 3) 
FROM yourTable 

這裏的一般策略是使用SUBSTRING(),這就需要開始和有問題的中間字符串的結束位置。我們可以使用CHARINDEX來查找字符串中的第一個和第二個破折號。由此我們可以計算出我們想要的中間子串的位置。

演示在這裏:

Rextester

+0

無效長度參數傳遞給LEFT或SUBSTRING函數 – GuidoG

+0

同樣的,我的。傳遞給LEFT或SUBSTRING函數的長度參數無效。 –

+0

對不起,我把參數順序傳遞給'CHARINDEX'。它現在似乎在工作。 –

0

這將找到的第2次出現之間的文本「 - 」

DECLARE @word nvarchar(max) 
SET @word = 'Technical Materials - Conversion - Team Dashboard' 

SELECT SUBSTRING(x, 0, charindex('-', x)) 
FROM (values(stuff(@word, 1, charindex('-', @word), ''))) x(x) 

這會發現中間元素。在偶數個元件的情況下,它會選擇第一2箇中間元件

DECLARE @word nvarchar(max) 
SET @word = 'Technical Materials - Conversion - Team Dashboard' 

;WITH CTE(txt, rn, cnt) as 
(
    SELECT 
    t.c.value('.', 'VARCHAR(2000)'), 
    row_number() over (order by (select 1)), count(*) over() 
    FROM (
     SELECT x = CAST('<t>' + 
      REPLACE(@word, ' - ', '</t><t>') + '</t>' AS XML) 
) a 
CROSS APPLY x.nodes('/t') t(c) 
) 
SELECT txt 
FROM CTE 
WHERE (cnt+1)/2 = rn