変数名を含む列があります。
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