MSSQLには以下の行があります。
Got event with: 123.123.123.123, event 34, brown fox
SQLの1行で信頼できる2番目の数値(34)をどのように抽出できますか?
MSSQLには以下の行があります。
Got event with: 123.123.123.123, event 34, brown fox
SQLの1行で信頼できる2番目の数値(34)をどのように抽出できますか?
SUBSTRING
andを使用してそれを行う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
これをテーブルに適用するには、単に@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
まだ言及されていない別の方法を考えました。以下が当てはまると仮定します。
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
はドットの周囲を解析しますが、カンマの周囲を解析したいと考えています。これが私がやったことのロジックです:
ParseName
て使用するParseName
して求めます。あなたの例では、これにより値「イベント34」が得られます。他のソリューションと比較したパフォーマンスについてはコメントしていません。とにかく私はそこにアイデアを捨てると思った!