2

SQL Server テーブルにnvarchar(50)列があり、次のようなデータがあります。

123abc
234abc
456abc

私のクエリ:

select * 
from table 
where col like '%abc'

期待される結果: すべての行が返されるはずです 実際の結果: 行は返されません

列が の場合は問題なく動作しvarcharますが、タイプが の場合は行を返しませんnvarchar

何か案は?

4

6 に答える 6

9

データの末尾にスペースがある可能性があります。この例を見てください。

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 と互換性があります。

于 2012-04-17T22:31:58.677 に答える
1

値の末尾にスペースがありませんか? これを行うと、空白を削除できます。

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'
于 2012-04-17T22:33:36.750 に答える
1

クエリは問題なく動作するはずですが、試すこともできます。

SELECT * FROM TABLE WHERE (COL LIKE '%abc%')

「abc」の後に見えない文字がある場合。

于 2012-04-17T22:42:07.283 に答える
0

これはうまくいきます。あなたが試すことができます。

SELECT * 
FROM "table"
WHERE CAST("col" AS VARCHAR) LIKE '%abc'
于 2021-01-02T18:01:24.847 に答える
0

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
于 2019-01-18T23:37:03.897 に答える