2016-11-04 3 views
0

のために求めているものよりも多くを与える:PATINDEXとCHARINDEXは私に私は、文字列を持っている

ALIS Predictions Y12 2016-17 Test Based Predictions 

を私はYの後に番号を返し、(例として)次のSQLを持っているしたいと思います:

SELECT SUBSTRING('ALIS Predictions Y12 2016-17 Test Based Predictions', 
       PATINDEX('%[0-9]%', 
          'ALIS Predictions Y12 2016-17 Test Based Predictions'), 
       CHARINDEX(' ', 
          'ALIS Predictions Y12 2016-17 Test Based Predictions' 
         ) 
       ) 

しかし、私が得る結果は次のとおりです。

12 20 

は確かに最終CHARINDEXは最初まで私の表現を与えるべきです スペース?私はそれを微調整して、Yの後の数値だけを得ることができますか?

答えて

0

ちょうど何が起こっているかを確認するために、それ自身の上の各セクションを評価する:ここでは別の方法で、それぞれあなたに19と5を与える

SELECT PATINDEX('%[0-9]%', 'ALIS Predictions Y12 2016-17 Test Based Predictions'), 
     CHARINDEX(' ', 'ALIS Predictions Y12 2016-17 Test Based Predictions') 

、あなたがで開始するようにsubstring関数を言っていますあなたが本当にやりたかったことは、開始文字列の後の最初のスペースを見つけることなので、開始する位置を指定するにはCHARINDEXに3番目の引数を渡す必要があります。わかりやすくするために、開始位置を数回使用する必要があるため、APPLYに移動しましたので、PATINDEX式を何回も繰り返すのではなく、エイリアスを再利用することができます。

SELECT SUBSTRING(t.Value, p.StartIndex, CHARINDEX(' ', t.Value, p.StartIndex) - p.StartIndex) 
FROM (SELECT 'ALIS Predictions Y12 2016-17 Test Based Predictions') AS t (Value) 
     CROSS APPLY (SELECT PATINDEX('%Y[0-9]%', t.Value) + 1) AS p (StartIndex) 
+0

ありがとう@GarethD。今、私は分かる。これは本当にうまくいく。 – Imran

0

問題は、3番目の引数が文字列内のの最初のスペースを見ていて、 "Y"の後のスペースではありません。

SELECT LEFT(numstr, CHARINDEX(' ', x.str) - 1) 
FROM (SELECT 'ALIS Predictions Y12 2016-17 Test Based Predictions' as str 
    ) x OUTER APPLY 
    (SELECT STUFF(x.str, 1, PATINDEX('%[0-9]%', x.str) - 1, '') as numstr 
    ) y; 
+0

ありがとうございましたGordonが、SQLを実行できませんでした。 – Imran

関連する問題