web-dev-qa-db-ja.com

t-sqlで文字列の一部を抽出するにはどうすればよいですか

次のnvarchar変数-BTA200がある場合、BTAだけを抽出するにはどうすればよいですか?

また、BTA50、BTA030などのさまざまな長さがある場合、数値部分のみを抽出するにはどうすればよいですか?

20
Xaisoft

PatIndexとLeftの組み合わせをお勧めします。慎重に構成されているため、データがどのようなものであっても、常に機能するクエリを作成できます。

例:

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('BTA200')
Insert Into @Temp Values('BTA50')
Insert Into @Temp Values('BTA030')
Insert Into @Temp Values('BTA')
Insert Into @Temp Values('123')
Insert Into @Temp Values('X999')

Select Data, Left(Data, PatIndex('%[0-9]%', Data + '1') - 1)
From   @Temp

PatIndexは、0〜9の範囲にある最初の文字を探し、その文字位置を返します。これをLEFT関数で使用して、正しいデータを抽出できます。 PatIndexは実際にはData + '1'を使用していることに注意してください。これにより、数字が見つからないデータから保護されます。数値がない場合、PatIndexは0を返します。この場合、Left(Data、PatIndex-1)を使用しているため、LEFT関数はエラーになります。 PatIndexが0を返すと、エラーを返すLeft(Data、-1)になります。

これが失敗する方法はまだあります。完全な説明については、以下を読むことをお勧めします。

SQL Serverを使用した数値の抽出

その記事は、文字列から数字を取得する方法を示しています。あなたの場合、代わりにアルファ文字を取得します。ただし、このプロセスは非常によく似ているので、そこから何か有用なことを学ぶことができます。

36
G Mastros

substring(field、1,3)はあなたの例で動作します。

select substring(field, 1,3) from table

また、アルファベット部分が可変長の場合、これを実行してアルファベット部分を抽出できます。

select substring(field, 1, PATINDEX('%[1234567890]%', field) -1) 
from table
where PATINDEX('%[1234567890]%', field) > 0
6
Stanislas Biron

LEFT( 'BTA200'、3)は、次のように、指定した例で機能します。

SELECT LEFT(MyField, 3)
FROM MyTable

数値部分を抽出するには、このコードを使用できます

SELECT RIGHT(MyField, LEN(MyField) - 3)
FROM MyTable
WHERE MyField LIKE 'BTA%' 
--Only have this test if your data does not always start with BTA.
3
RB.
declare @data as varchar(50)
set @data='ciao335'


--get text
Select Left(@Data, PatIndex('%[0-9]%', @Data + '1') - 1)    ---->>ciao

--get numeric
Select right(@Data, len(@data) - (PatIndex('%[0-9]%', @Data )-1) )   ---->>335
1
Xilmiki