SQL では 1 は常に「1」と等しいのでしょうか?
-
22-09-2019 - |
質問
数値を同じ数値の文字または文字列バージョンと比較するための標準 SQL 動作を決定しようとしています。する SELECT 1 = '1'
(または同様のもの) は、常に何らかの「真実の」値を返します (true
, 1
, 't'
, 、など)?PostgreSQLとMySQLについてはそれなりに確認しましたが、SQL全体のリソースが見つかりません。
アップデート: 質問の目的は、選択/挿入/更新などを行うときに引用符なしで数値を使用しても機能するかどうかを確認しようとしているということです。値が数値である非数値フィールドから。
解決
SELECT 1='1'
はTRUE
以来'1'
を与える私に知られている全ての実装でINT
の正しいコンストラクタです。
しかし、SQLがあることを確認、厳密な型指定を使用しています
# SELECT 1=CAST('1' AS TEXT);
ERROR: operator does not exist: integer = text
LINE 1: SELECT 1=CAST('1' AS TEXT);
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
標準(SQL 92、99&2003)については、間違っているようです。
<literal> ::=
<signed numeric literal>
| <general literal>
<general literal> ::=
<character string literal>
| <national character string literal>
| <bit string literal>
| <hex string literal>
| <datetime literal>
| <interval literal>
<signed numeric literal> ::=
[ <sign> ] <unsigned numeric literal>
<unsigned numeric literal> ::=
<exact numeric literal>
| <approximate numeric literal>
<exact numeric literal> ::=
<unsigned integer> [ <period> [ <unsigned integer> ] ]
| <period> <unsigned integer>
<unsigned integer> ::= <digit>...
<character string literal> ::=
[ <introducer><character set specification> ]
<quote> [ <character representation>... ] <quote>
[ { <separator>... <quote> [ <character representation>... ] <quote> }... ]
<quote>
のみ<bit string literal>
、<hex string literal>
に含まれているため、...ではなく、数値リテラルで...
他のヒント
SQLサーバー
if 1 = '1'
print 'yes'
else
print 'no'
出力:はい
これは変換されます。暗黙的および明示的な変換の可能性の全リストについては、ここを参照してください。 CAST と CONVERT (Transact-SQL)
SELECT 1 = '1'
でまず第一には、有効ではありません。けれども、あなたは以下のコードを実行した場合、あなたは1 =「1」
ないことがわかりますif (1 = '1') begin
print 'true'
end else begin
print 'false'
end
結果:
true
"SQL
「一般に」には「真実」の値という概念がありません。
とは異なり MySQL
そして PostgreSQL
, 、 で Oracle
そして SQL Server
, 、内部データ型はブール値として使用できません。 WHERE
条項または WHEN
述語。
これらの句では、常に何らかの述語を使用する必要があります。
ではデータ型を使用できません mydata
これらのクエリを機能させるには:
SELECT 1
WHERE @mydata
または
SELECT 1
FROM dual
WHERE :mydata
また、いいえ SQL
標準は型キャスト順序を規定しています。
定数のデータ型を列のデータ型にキャストしたり、その逆を行うことができます。
これにより、で説明したのと同様の問題が発生する可能性があります。 この質問.
1は、数あると「1」のいくつかの並べ替えのCHAR配列である、彼らは同じであってはなりません。彼らはしている場合それは実装依存の動作です。
のMySQL 5.xおよびSQL Server 2005のからのテストは、彼らの両方がtrueを返すために、評価のため'1'
に1
の暗黙的な変換を実行します。
しかし、それはまた、照合としなければならない可能性があります。
、SQL標準に従って、比較1 = '1'
が許可されていません。
質問(更新テキストを与えられた)がいる場合ではありません。
SELECT 1 = '1'
は動作しますが、以下となります。
SELECT '1'::text = 1
作品。どのコースである:なし。 PostgreSQLの上少なくとも、本当に良い理由ます。
のために
あなたが次のことをやりたいようにあなたのアップデート音ます:
SELECT *
FROM MyTable
WHERE StringColumn = 1
それは動作しません。あなたは、非数値であること文字列内の任意の値を持っている場合は、すぐにSQLエンジンは、その行になるように、エラーがスローされます。 MS SQL Serverではエラーがある "データ型intにvarchar型の値が '何とか' を変換するときにの変換が失敗しました。の"
あなたが比較を行いたい場合は、だから、あなたは必ずデータ型のように比較されていることを確認しなければならないでしょう。たとえばます:
SELECT *
FROM MyTable
WHERE StringColumn = '1'
単にSELECT 1
を使用しています。それは常にtrueになります。