0

MSSQLには以下の行があります。

Got event with: 123.123.123.123, event 34, brown fox

SQLの1行で信頼できる2番目の数値(34)をどのように抽出できますか?

4

3 に答える 3

2

SUBSTRINGandを使用してそれを行う1つの方法を次に示しますPATINDEX-私はCTEを使用したので、それほどひどく見えません:)

WITH CTE AS (
  SELECT
     SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)) data
  FROM Test
  )
SELECT LEFT(SUBSTRING(Data, PATINDEX('%[0-9]%', Data), 8000), 
         PATINDEX('%[^0-9]%', 
         SUBSTRING(Data, PATINDEX('%[0-9]%', Data), 8000) + 'X')-1)
FROM CTE

そして、ここにいくつかのサンプルFiddleがあります。

コメントしたように、CTE は 2005 以降でのみ機能します。たまたま 2000 を使用している場合、これは CTE なしで機能します。

SELECT LEFT(SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)), 
         PATINDEX('%[0-9]%', SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data))), 8000), 
         PATINDEX('%[^0-9]%', 
         SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)), 
         PATINDEX('%[0-9]%', SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data))), 8000) + 'X')-1)
FROM Test
于 2013-02-19T14:08:10.663 に答える
1

これをテーブルに適用するには、単に@sあなたと交換してください。column nameその番号が最後のコンマと最後のコンマの前のスペースの間にあると仮定します。SQL-フィドル-デモ

declare @s varchar(100) = '123.123.123.123, event 34, brown fox'

select right(first, charindex(' ', reverse(first),1) ) final
from (             
  select left(@s,len(@s) - charindex(',',reverse(@s),1)) first
  --from tableName
) X

または、最初のカンマと2番目のカンマの間にある場合は、 DEMOを試してください。

select substring(first, charindex(' ',first,1), 
                 charindex(',', first,1)-charindex(' ',first,1)) final
from (             
  select right(@s,len(@s) - charindex(',',@s,1)-1) first
) X
于 2013-02-19T14:17:53.690 に答える
0

まだ言及されていない別の方法を考えました。以下が当てはまると仮定します。

  • 2 番目の「部分」の前には常に 1 つのコンマ
  • それは常に「イベント」という言葉で、2 番目の部分に番号が付きます
  • SQL Server 2005 以降を使用している

ParseName次に、SysName データ型を解析するための組み込み関数を使用できます。

--Variable to hold your example
DECLARE @test NVARCHAR(50)
SET @test = 'Got event with: 123.123.123.123, event 34, brown fox'

SELECT Ltrim(Rtrim(Replace(Parsename(Replace(Replace(@test, '.', ''), ',', '.'), 2), 'event', '')))

結果:

34

ParseNameはドットの周囲を解析しますが、カンマの周囲を解析したいと考えています。これが私がやったことのロジックです:

  1. 文字列内の既存のドットをすべて削除します。この場合、それらを空の文字列と交換します。
  2. すべてのコンマをドットに交換しParseNameて使用する
  3. 2番目の「ピース」を使用ParseNameして求めます。あなたの例では、これにより値「イベント34」が得られます。
  4. 文字列から「イベント」という単語を削除します。
  5. 両端をトリムして値を返します。

他のソリューションと比較したパフォーマンスについてはコメントしていません。とにかく私はそこにアイデアを捨てると思った!

于 2013-02-19T14:41:19.737 に答える