/ /文字列から文字列を抜き出します。 SQL - sql、sql-server、sql-server-2012

部分文字列から始まる文字列からテキストを抽出します。 SQL - sql、sql-server、sql-server-2012

変数名を含む列があります。

UB121216SVC0054
12122016TH10076
UB121216OH10058

私は右から始めて文字を抽出したい。

SVC
TH
OH

文字と数字の数が異なるため、部分文字列を使用して最初と最後の文字を指定することはできません。

これについてどうすればいいですか?

回答:

回答№1は1

これはすべてのテストケースで機能します... それは、最初にすべての末尾の数字をトリムし、その後に数字が見つかるまで、それより前の文字をサブストリングのみにします。 @varをテストケースに変更します。

declare @var varchar(50) = " "

select case when @var is not null and @var <> "" then
right(reverse(substring(reverse(@var),PATINDEX("%[^0-9]%",reverse(@var)),len(@var) - PATINDEX("%[^0-9]%",reverse(@var)))),PATINDEX("%[0-9]%",reverse(reverse(substring(reverse(@var),PATINDEX("%[^0-9]%",reverse(@var)),len(@var) - PATINDEX("%[^0-9]%",reverse(@var)))))) - 1)
else null end

EDIT

declare @var varchar(50) = "claim_ud   H4748sd115600"

select case
when @var is not null and @var <> "" then
case
when  PATINDEX("% %",@var) = 0 then
right(reverse(substring(reverse(@var),PATINDEX("%[^0-9]%",reverse(@var)),len(@var) - PATINDEX("%[^0-9]%",reverse(@var)))),PATINDEX("%[0-9]%",reverse(reverse(substring(reverse(@var),PATINDEX("%[^0-9]%",reverse(@var)),len(@var) - PATINDEX("%[^0-9]%",reverse(@var)))))) - 1)
else
right(reverse(substring(reverse(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1)),PATINDEX("%[^0-9]%",reverse(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1))),len(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1)) - PATINDEX("%[^0-9]%",reverse(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1))))),PATINDEX("%[0-9]%",reverse(reverse(substring(reverse(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1)),PATINDEX("%[^0-9]%",reverse(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1))),len(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1)) - PATINDEX("%[^0-9]%",reverse(stuff(@var,PATINDEX("% %",@var),PATINDEX("% %",reverse(@var)) - PATINDEX("% %",@var),1))))))) - 1)
end
else null end

回答№2の場合は0

あなたが与える例については、次のコードは単純な解決策のように思えます。

select (case when substring(col, 11, 1) between "0" and "9"
then substring(col, 9, 2)
else substring(col, 9, 3)
end)

これは、コードが2文字または3文字で、常に9番目の位置から始まると仮定しています。


回答№3の場合は0

このバージョンではRaduのコードと同じ基本実行計画が作成されていますが、私ははるかに読みやすくなっています。

-- Create a testing table
CREATE TABLE #codes (code varchar(32))
GO
INSERT INTO #codes Values ("UB121216SVC0054")
INSERT INTO #codes Values ("12122016TH10076")
INSERT INTO #codes Values ("UB121216OH10058")
GO
-- Get the substring data
SELECT   -- Get the data up to the first non-letter
Reverse(LEFT(fragment, patindex("%[^A-Za-z]%", fragment)-1)) as substr
FROM (  -- trim the field at the first letter
SELECT SUBSTRING(rcode, patindex("%[A-Za-z]%", rcode), len(rcode)) as fragment
FROM (  -- Working with the reversed values
SELECT reverse(code) as rcode
FROM #codes
) as ReverseTable
) as WorkTable