mysql> select 0.121='0.121';
+---------------+
| 0.121='0.121' |
+---------------+
| 1 |
+---------------+
number='number'
それは他のデータベースにも当てはまりますtrue
か?
mysql> select 0.121='0.121';
+---------------+
| 0.121='0.121' |
+---------------+
| 1 |
+---------------+
number='number'
それは他のデータベースにも当てはまりますtrue
か?
まず第一に、ほとんどのデータベースはローカライズされた数値形式を使用しています。そのため、数値を文字列に変換しても、ハードコードされた文字列と同じになるとは限りません。
次に、使用する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"
(コンマに注意してください) になります。
したがって、最終的に質問に答えるには:いいえ。
たとえそうだとしても。これは何に役立ちますか? とにかく、私は決してこの仮定をしません。両方のオペランドを常に同じ型に変換して、少なくとも何を比較しているのかを理解する必要があります。
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タイプであるとは想定せず、代わりに予備の「不明」タイプを割り当てます。その最終的なタイプは、後でいくつかのヒューリスティックによって推測されます。
とにかく、他の人が述べているように、これに依存するのは悪い習慣です。
いいえ。
Stackoverflow でこの質問に 3 文字以上入力する必要がある理由がわかりません。