1
mysql> select 0.121='0.121';
+---------------+
| 0.121='0.121' |
+---------------+
|             1 |
+---------------+

number='number'それは他のデータベースにも当てはまりますtrueか?

4

5 に答える 5

6

まず第一に、ほとんどのデータベースはローカライズされた数値形式を使用しています。そのため、数値を文字列に変換しても、ハードコードされた文字列と同じになるとは限りません。

次に、使用するSQL構文で問題が発生します。私のオラクルの実験を参照してください。


Oracle では常に FROM 句が必要です (ただし、バージョン 10 でこれが変更されました)。

select 0.121='0.121' from sys.dual

Oracle では、select 句にこのような式を含めることはできません。

ケースステートメントが必要です:

select case when 0.121 = '0.121' then 1 else 0 end as xy 
from sys.dual

次に、番号ではないというエラーが表示されます。これを修正するには、次のように変換します。

select case when To_Char(0.121) = '0.121' then 1 else 0 end as xy 
from sys.dual

これは戻り0ます!私のマシンで0.121は、が文字列に変換されるため".121"です。これらはスイスの設定です。ドイツ語の設定があれば、",121"(コンマに注意してください) になります。

したがって、最終的に質問に答えるには:いいえ

于 2010-04-21T16:09:04.323 に答える
3

たとえそうだとしても。これは何に役立ちますか? とにかく、私は決してこの仮定をしません。両方のオペランドを常に同じ型に変換して、少なくとも何を比較しているのかを理解する必要があります。

于 2010-04-21T16:09:02.017 に答える
0

Postgresqlは、型変換に関してmysqlよりも少し厳密であり、数値と文字列の間で暗黙的にキャスト/変換することはできません。これは正常な動作であり、新しいバージョンでは少し厳しくなります。Postgres 8.4からのいくつかの例:

db=# select 0.112::float = '0.112'::text;
ERROR:  operator does not exist: double precision = text
LINE 1: select 0.112::float = '0.112'::text;
                            ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

db=# select 0.112 = ('0.1' || '12');
ERROR:  operator does not exist: numeric = text
LINE 1: select 0.112 = ('0.1' || '12');
                     ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

db=# select 0.112 = ('0.1' || '12')::float; -- explicit cast
 t

ただし、この例(元の質問)は機能します。

db=# select 0.122 = '0.122';
 t

上記を考えると、これは少し驚くべき(または誤解を招く)ものです。ただし、クエリの解析方法と関係があります。(修飾されていない)「0.122」リテラルを検出した場合、パーサーは必ずしもTEXTタイプであるとは想定せず、代わりに予備の「不明」タイプを割り当てます。その最終的なタイプは、後でいくつかのヒューリスティックによって推測されます。

とにかく、他の人が述べているように、これに依存するのは悪い習慣です。

于 2010-04-21T18:48:43.463 に答える
0

評判の良いデータベースのほとんどは、このタイプのクエリに対して暗黙的な変換を行います。特定のシステムでの暗黙的な変換に関するルールが公開されている場合があります。システムでどのような暗黙的な変換が行われているかを確認するには、ベンダーの説明を確認する必要があります。

たとえば、 SQL Server 2000 に関する Microsoft の公式リファレンスは 次のとおりです。また、SQL Server の暗黙的な変換に関するブログ エントリは次のとおりです

于 2010-04-21T16:16:42.697 に答える
0

いいえ。

Stackoverflow でこの質問に 3 文字以上入力する必要がある理由がわかりません。

于 2010-04-21T18:23:02.890 に答える