这种行为是否存在于所有主要数据库中?

时间:2010-04-21 16:03:44

标签: sql comparison database-agnostic

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

是否适用于number='number'true的其他数据库?

5 个答案:

答案 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)

对于type conversion

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推断出来。

无论如何,如其他人所提到的那样依靠这种做法是不好的做法。