SQL Server テーブルにnvarchar(50)
列があり、次のようなデータがあります。
123abc
234abc
456abc
私のクエリ:
select *
from table
where col like '%abc'
期待される結果: すべての行が返されるはずです 実際の結果: 行は返されません
列が の場合は問題なく動作しvarchar
ますが、タイプが の場合は行を返しませんnvarchar
。
何か案は?
SQL Server テーブルにnvarchar(50)
列があり、次のようなデータがあります。
123abc
234abc
456abc
私のクエリ:
select *
from table
where col like '%abc'
期待される結果: すべての行が返されるはずです 実際の結果: 行は返されません
列が の場合は問題なく動作しvarchar
ますが、タイプが の場合は行を返しませんnvarchar
。
何か案は?
データの末尾にスペースがある可能性があります。この例を見てください。
Declare @Temp Table(col nvarchar(50))
Insert Into @Temp(col) Values(N'123abc')
Insert Into @Temp(col) Values(N'456abc ')
Select * From @Temp Where Col Like '%abc'
上記のコードを実行すると、456 行の末尾にスペースがあるため、123 行のみが取得されます。
以下に示すコードを実行すると、期待どおりのデータが得られます。
Declare @Temp Table(col nvarchar(50))
Insert Into @Temp(col) Values(N'123abc')
Insert Into @Temp(col) Values(N'456abc ')
Select * From @Temp Where rtrim(Col) Like '%abc'
オンラインの書籍の LIKE に関するドキュメントによると (強調は鉱山): http://msdn.microsoft.com/en-us/library/ms179859.aspx
LIKE を使用したパターン マッチング
LIKE は、ASCII パターン マッチングと Unicode パターン マッチングをサポートします。すべての引数 (match_expression、pattern、および escape_character (存在する場合)) が ASCII 文字データ型の場合、ASCII パターン マッチングが実行されます。引数のいずれかが Unicode データ型の場合、すべての引数が Unicode に変換され、Unicode パターン マッチングが実行されます。LIKE で Unicode データ (nchar または nvarchar データ型) を使用する場合、末尾の空白は重要です。ただし、非 Unicode データの場合、末尾の空白は重要ではありません。Unicode LIKE は ISO 標準と互換性があります。ASCII LIKE は、以前のバージョンの SQL Server と互換性があります。
値の末尾にスペースがありませんか? これを行うと、空白を削除できます。
select *
from yourTable
where rtrim(yourcolumn) like '%abc'
RTRIM
と を一緒に使用したくない場合は、LIKE
次も使用できます。
Select *
From yourTable
Where charindex('abc', col) > 0
Microsoft からLIKEの使用について:
SQL Server は、文字列をスペースと比較する方法について、ANSI/ISO SQL-92 仕様 (セクション 8.2、一般規則 #3) に従います。ANSI 標準では、比較に使用する文字列を比較する前に長さが一致するように、文字列のパディングが必要です。パディングは、WHERE 句と HAVING 句の述語、およびその他の Transact-SQL 文字列比較のセマンティクスに直接影響します。たとえば、Transact-SQL では、文字列 'abc' と 'abc ' はほとんどの比較操作で同等であると見なされます。
この規則の唯一の例外は、LIKE 述語です。LIKE 述語式の右側に値の末尾にスペースがある場合、SQL Server は比較を行う前に 2 つの値を同じ長さにパディングしません。LIKE 述語の目的は、定義上、単純な文字列の等価性テストではなく、パターン検索を容易にすることであるため、これは前述の ANSI SQL-92 仕様のセクションに違反しません。
「abc」文字列の開始位置がわかっている場合は、次を使用できますSUBSTRING
。
Select *
From yourTable
Where substring(Col, 4, 3) = 'abc'
ただし、charindex と substring を一緒に使用することができ、空白について心配する必要はありません。
select *
from yourTable
where substring(col, charindex('abc', col), 3) = 'abc'
クエリは問題なく動作するはずですが、試すこともできます。
SELECT * FROM TABLE WHERE (COL LIKE '%abc%')
「abc」の後に見えない文字がある場合。
これはうまくいきます。あなたが試すことができます。
SELECT *
FROM "table"
WHERE CAST("col" AS VARCHAR) LIKE '%abc'
ASCII と Unicode の奇妙さのいくつかを文書化するだけです。
-- ascii like
if 'Non rational ' like 'Non[ --]rational%' print 'like' else print 'not like'
-- unicode like
if N'Non rational ' like N'Non[ --]rational%' print 'like' else print 'not like'
-- unicode like, trailing space removed
if N'Non rational' like N'Non[ --]rational%' print 'like' else print 'not like'
-- unicode like, different wildcard
if N'Non rational ' like N'Non_rational%' print 'like' else print 'not like'
以下を生成します。
like
not like
not like
like