-4

次のような 2 つのクエリがあります。

クエリ #1:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) IN ('6', '8', '9', '10', '12', '14', '110', '106')

クエリ #2:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) IN (SELECT ('6'', ''8'', ''9'', ''10'', ''12'', ''14'', ''110'', ''106'))

2 番目のクエリで行が返されないのはなぜですか? 最初のクエリがいくつかの行を返すとき。

4

4 に答える 4

2

クエリ#2に一重引用符が多すぎます...

また、もしIDが数値列である場合-なぜ単に使用しないのですか?

SELECT * 
FROM dbo.Products 
WHERE ID IN (6, 8, 9, 10, 12, 14, 110, 106)

はるかに簡単で、不必要CASTに関与することはありません....。

また、本当に必要な場合は、常に長さを定義するCASTことをお勧めします。そうしないと、文字列が切り捨てられる可能性があります。VARCHAR

したがって、次を使用します CAST(ID AS VARCHAR(100))CAST(ID AS VARCHAR)

于 2012-10-11T10:32:35.300 に答える
0

2番目のクエリはこれと同等です。

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) IN ('6'', ''8'', ''9'', ''10'', ''12'', ''14'', ''110'', ''106')

またはこれさえ:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) = '6'', ''8'', ''9'', ''10'', ''12'', ''14'', ''110'', ''106'

したがって、IDの行がないため、行は返されません。6', '8', '9', '10', '12', '14', '110', '106

于 2012-10-11T10:32:59.107 に答える
0

2 番目のクエリは、値を 1 つの文字列と見なします。

IN 句で使用する場合は、文字値を区切るために '' (一重引用符) を使用する必要があります

于 2012-10-11T10:31:41.320 に答える
0

2 番目のクエリで行が返されないのはなぜですか? 最初のクエリがいくつかの行を返すとき。

2 番目のクエリの述語のSELECTステートメントによって返される値は、次の1 つの文字列値のみを返すためです。IN

6','8','9','10','12','14','110','106

したがって、キャストされた int ID 値を 1 つの文字列値のみと比較することになる6','8','9','10','12','14','110','106'ため、クエリは次のように評価されます。

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR)  = ''6','8','9','10','12','14','110','106'';

INただし、最初のクエリの句内には異なる文字列値があります。

6   8   9   10  12  14  110 106

ただし、それを varchar にキャストする必要はまったくありませんでした。

SELECT * 
FROM dbo.Products 
WHERE ID IN (6, 8, 9, 10, 12, 14, 110, 106)
于 2012-10-11T10:31:52.113 に答える