0

SQL Server 2008 で次のようなクエリを作成しました。

SELECT TOP 1 SPECIAL_CODE1 * 
  FROM CUSTOMERS 
 WHERE isnumeric(SPECIAL_CODE1)=1 
ORDER BY SPECIAL_CODE1 DESC

クエリ結果は として返され'9970'ます。'34780'またはの列値を持つ行があります'19850'

クエリを修正するにはどうすればよいですか?

4

4 に答える 4

4

文字列値 ('9' > '3') の場合、'9970' は '34780' より大きくなります。それが整数として定義されたフィールドである場合、当然事情は異なります。次のようなものを試してください

SELECT TOP 1 SPECIAL_CODE1 * FROM CUSTOMERS 
WHERE isnumeric(SPECIAL_CODE1)=1 
ORDER BY CAST (SPECIAL_CODE1 AS INTEGER) DESC
于 2012-07-14T15:20:04.327 に答える
1

結果を SPECIAL_CODE1 で並べ替えているようです。フィールドのデータ型は何ですか?varchar または char のようです。並べ替えるときは、データ型を変換する必要があります。たとえば、ORDER BY CAST(SPECIAL_CODE1 AS INT) は、文字ベースのソートではなく数値でソートされた結果を返します。

于 2012-07-14T15:24:44.660 に答える
1

上記のクエリが機能するのは、おそらくフィルタの後に order by が評価されるからです。ただし、キャストを case ステートメントで囲む方が安全です。

order by (case when isnumeric(special_code1) = 1 then cast(special_code1 as int) end)

case ステートメントは、評価の順序を保証する唯一のステートメントです。SELECT など、クエリの他の場所でキャストが発生した場合、クエリは、最初に数値以外の値にヒットしたときにエラーを生成する可能性があります。

SQL は宣言型言語であるため、クエリ エンジンは予期しない方法でクエリのコンポーネントを再配置できます。

于 2012-07-14T15:37:55.427 に答える
1

列は整数ではなく文字データとして格納されています (「111」があっても、「99」で始まるものが最高であると見なされることに注意してください)。解決策は、スキーマを変更してその列に整数を格納するか、クエリを変更して列をキャストすることです。

SELECT ... ORDER BY CAST(SPECIAL_CODE1 as int) DESC
于 2012-07-14T15:21:20.853 に答える