2017-05-29 5 views
2

基本的には、同じ文字の2番目のオカレンス(この場合、ダッシュ " - ")を使用して中間語を取得したいということです。2番目の位置のCharindex経由でサブストリングを使用して中間語を取得するには?

これはサンプル入力です:

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

あり、この文には3つの部分があり、それらがによって分割されている「 - 」破線。

最初の部分は私が使用して取得することができています「技術資料」です:

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を使用することができます、次に:

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

フォーマットが固​​定されているとはどういう意味ですか?私はこのコードが動作しないフォーマットを意味しますか? –

+1

彼はいつも2 ' - 'で、 'ではない'という意味です。値 – GuidoG

+0

で私はここで2つのダッシュを意味しました。クエリが2ダッシュ以下/多い場合はクエリを変更する必要があります – Arulkumar

2

は、この文字列で検索してください:

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

は、ここでは一般的な戦略は、問題の真ん中の文字列の開始と終了位置を必要とする、SUBSTRING()を使用することです。 CHARINDEXを使用すると、文字列の最初と2番目のダッシュを見つけることができます。これから、私たちが望む真ん中の部分文字列の位置を計算することができます。あなたが余分なスペースをトリミングする場合

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

:ここ

デモ:

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 
関連する問題