3

数値を同じ数値の文字または文字列バージョンと比較するための標準SQLの動作を判別しようとしています。SELECT 1 = '1'(または同様のもの)は常にある種の「真実の」値(、、、など)をtrue返し1ます't'か?PostgreSQLとMySQLについては同じくらい確認しましたが、SQL全体のリソースが見つかりません。

更新:質問の目的は、引用符なしで数字を使用することが、選択/挿入/更新などのときに機能するかどうかを理解しようとしていることです。値が数値である非数値フィールドから。

4

10 に答える 10

6

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>

于 2010-01-25T17:20:19.493 に答える
2

SQL一般的に」には「真実」の価値の概念はありません。

MySQLand PostgreSQL、in、Oracleおよびとは異なり、内部データ型を句または述語SQL Serverのブール値として使用することはできません。WHEREWHEN

これらの句で使用する述語は常にあるはずです。

mydataこれらのクエリを機能させるためにデータ型を使用することはできません。

SELECT  1
WHERE   @mydata

また

SELECT  1
FROM    dual
WHERE   :mydata

また、SQL型キャストの順序を規定する規格はありません。

定数のデータ型は、列のデータ型のデータ型にキャストできます。その逆も可能です。

これにより、この質問で説明されているのと同様の問題が発生する可能性があります。

于 2010-01-25T17:26:14.227 に答える
2

まず、SQLServerではSELECT 1 = '1'無効です。ただし、次のコードを実行すると、1が='1'であることがわかります。

if (1 = '1') begin
    print 'true'
end else begin
    print 'false'
end

結果:

true
于 2010-01-25T17:22:32.040 に答える
2

SQLサーバー

if 1 = '1'
print 'yes'
else
print 'no'

出力:はい

これは変換されます。暗黙的および明示的な変換の可能性の全リストについては、CASTおよびCONVERT(Transact-SQL)を参照してください。

于 2010-01-25T17:20:22.450 に答える
1

1は数値であり、「1」はある種のCHAR配列であり、決して等しくなることはありません。それらが実装に依存する動作である場合

于 2010-01-25T17:19:22.897 に答える
1

MySQL5.xおよびSQLServer2005からのテストでは、どちらも'1'intoの暗黙的な変換を実行し1て、評価がtrueを返します。

しかし、それは照合にも関係している可能性があります。

于 2010-01-25T17:20:53.553 に答える
0

多くの実装で機能するように見えますが、SQL標準に従って、比較1 = '1'は許可されていません。

于 2010-01-25T17:59:21.353 に答える
0

(更新テキストが与えられた場合の)問題は、次の場合ではありません。

SELECT 1 = '1'

動作しますが、動作します:

SELECT '1'::text = 1

仕事。もちろん、これは違います。少なくともPostgreSQLでは、そして本当に正当な理由があります。

于 2010-01-25T18:01:30.990 に答える
0

アップデートから:

更新は、次のことを実行したいようです。

SELECT *
FROM MyTable 
WHERE StringColumn = 1

それは機能しません。その文字列列に数値以外の値がある場合、SQLエンジンがその行に到達するとすぐに、エラーがスローされます。MS SQL Serverでは、エラーは「varchar値'blah'をデータ型intに変換するときに変換に失敗しました。」です。

したがって、比較を行う場合は、データ型のように比較していることを確認する必要があります。例えば:

SELECT *
FROM MyTable 
WHERE StringColumn = '1'
于 2010-01-25T18:18:57.430 に答える
-1

「常に真」のselectステートメントの場合は、単に。を使用しますSELECT 1。それは常に真実です。

于 2010-01-25T17:20:30.023 に答える