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 实验。
在 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"
(注意逗号)。
所以最后回答这个问题:不。
即使确实如此。这对你有什么帮助?无论如何,我永远不会做出这个假设。您总是需要将两个操作数转换为相同的类型,以便至少知道您在比较什么。
不。
我不知道为什么 Stackoverflow 要求我输入超过 3 个字符来回答这个问题。
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 类型,而是分配一个初步的“未知”类型;它的最终类型稍后由一些启发式推导出来。
无论如何,正如其他人所提到的,依赖这个是不好的做法。