SQL Server 2008 で次のようなクエリを作成しました。
SELECT TOP 1 SPECIAL_CODE1 *
FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY SPECIAL_CODE1 DESC
クエリ結果は として返され'9970'
ます。'34780'
またはの列値を持つ行があります'19850'
。
クエリを修正するにはどうすればよいですか?
SQL Server 2008 で次のようなクエリを作成しました。
SELECT TOP 1 SPECIAL_CODE1 *
FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY SPECIAL_CODE1 DESC
クエリ結果は として返され'9970'
ます。'34780'
またはの列値を持つ行があります'19850'
。
クエリを修正するにはどうすればよいですか?
文字列値 ('9' > '3') の場合、'9970' は '34780' より大きくなります。それが整数として定義されたフィールドである場合、当然事情は異なります。次のようなものを試してください
SELECT TOP 1 SPECIAL_CODE1 * FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY CAST (SPECIAL_CODE1 AS INTEGER) DESC
結果を SPECIAL_CODE1 で並べ替えているようです。フィールドのデータ型は何ですか?varchar または char のようです。並べ替えるときは、データ型を変換する必要があります。たとえば、ORDER BY CAST(SPECIAL_CODE1 AS INT) は、文字ベースのソートではなく数値でソートされた結果を返します。
上記のクエリが機能するのは、おそらくフィルタの後に order by が評価されるからです。ただし、キャストを case ステートメントで囲む方が安全です。
order by (case when isnumeric(special_code1) = 1 then cast(special_code1 as int) end)
case ステートメントは、評価の順序を保証する唯一のステートメントです。SELECT など、クエリの他の場所でキャストが発生した場合、クエリは、最初に数値以外の値にヒットしたときにエラーを生成する可能性があります。
SQL は宣言型言語であるため、クエリ エンジンは予期しない方法でクエリのコンポーネントを再配置できます。
列は整数ではなく文字データとして格納されています (「111」があっても、「99」で始まるものが最高であると見なされることに注意してください)。解決策は、スキーマを変更してその列に整数を格納するか、クエリを変更して列をキャストすることです。
SELECT ... ORDER BY CAST(SPECIAL_CODE1 as int) DESC