質問

数値を同じ数値の文字または文字列バージョンと比較するための標準 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)

SQL Serverの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の上少なくとも、本当に良い理由ます。

のために
Updateから

あなたが次のことをやりたいようにあなたのアップデート音ます:

SELECT *
FROM MyTable 
WHERE StringColumn = 1
それは動作しません。あなたは、非数値であること文字列内の任意の値を持っている場合は、すぐにSQLエンジンは、その行になるように、エラーがスローされます。 MS SQL Serverではエラーがある "データ型intにvarchar型の値が '何とか' を変換するときにの変換が失敗しました。の"

あなたが比較を行いたい場合は、

だから、あなたは必ずデータ型のように比較されていることを確認しなければならないでしょう。たとえばます:

SELECT *
FROM MyTable 
WHERE StringColumn = '1'
「常に真」SELECTステートメントの単にSELECT 1を使用しています。それは常にtrueになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top