mysql> select 0.121='0.121';
+---------------+
| 0.121='0.121' |
+---------------+
| 1 |
+---------------+
是否适用于number='number'
为true
的其他数据库?
答案 0 :(得分:6)
首先:大多数数据库都使用本地化数字格式。因此,将数字转换为字符串很可能并不总是与硬编码字符串相同。
然后:您将遇到使用sql语法的问题。请参阅oracle bellow的实验。
在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"
(请注意逗号)。
所以最后回答这个问题:否。
答案 1 :(得分:3)
即使它确实如此。这对你有什么帮助? 无论如何,我永远不会做出这个假设。您总是需要将两个操作数转换为相同的类型,以便至少知道您要比较的内容。
答案 2 :(得分:0)
大多数信誉良好的数据库都会对此类查询进行隐式转换。可能存在针对特定系统的隐式转换的已发布规则 - 您必须查看供应商管理以找出在您的系统上进行的隐式转换。
例如, here是Microsoft对SQL Server 2000的官方参考,并且 here是关于SQL Server隐式转换的博客条目。
答案 3 :(得分:0)
没有
我不知道为什么Stackoverflow要求我输入超过3个字符来回答这个问题。
答案 4 :(得分: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类型,而是指定一个初步的“未知”类型;它的最终类型后来由一些heuristics推断出来。
无论如何,如其他人所提到的那样依靠这种做法是不好的做法。