SQLステートメントを実行しようとしています
SELECT *
FROM Menu
WHERE ISNumeric(Data) = 1
AND Data = 296
Data
フィールドには、数値または数値以外の内容が含まれる場合があります。しかし、次のような構文エラーが発生しています
データ型 int の列の varchar-value '/home' を変換する際の構文エラー。
SQLステートメントを実行しようとしています
SELECT *
FROM Menu
WHERE ISNumeric(Data) = 1
AND Data = 296
Data
フィールドには、数値または数値以外の内容が含まれる場合があります。しかし、次のような構文エラーが発生しています
データ型 int の列の varchar-value '/home' を変換する際の構文エラー。
列はvarcharであるため、値( 296)を一重引用符でDATA
囲む必要があります
SELECT *
FROM Menu
WHERE ISNumeric(Data) = 1 AND Data = '296'
ここを使用せずに直接クエリを実行できISNUMERIC
、すべてのレコードで数値をチェックする必要がないため、パフォーマンスが向上します。
あなたの状況では、使用するIsNumeric
ことは無意味だと思います。
SELECT *
FROM Menu
WHERE Data = '296'
残念ながら、SQLは短絡評価を保証しないため、最初の条件がfalseの場合、IsNumeric(Data)
フィルターは2番目の述部の評価を妨げません。Data = 296
ただし、できることは、比較をcharリテラルとして残すことです。
SELECT *
FROM Menu
WHERE ISNumeric(Data) = 1
AND Data = '296';
興味深いことに、IsNumeric
正確な数値と比較している場合、なぜチェックを行う必要があるのでしょうか。
@StuartLCの回答に追加するだけで、これに対する1つの回避策は、サブクエリを使用して最初にすべての数値を取得することです。
SELECT *
FROM (
SELECT CAST(Data AS int) AS Data,
-- Other fields
FROM Menu
WHERE ISNumeric(Data) = 1
) subquery
WHERE subquery.Data = 296
ただし、IsNumeric はこれらに対して返されるため、10 進数、科学表記法、またはそのようなものがないことを確認する必要があることに注意して1
ください。この質問は、その周りの問題を解決するのに役立ちます...