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

它适用于其他数据库number='number'true

4

5 回答 5

6

首先:大多数数据库都使用本地化的数字格式。因此,将数字转换为字符串很可能并不总是与您的硬编码字符串相同。

然后:你会遇到你使用的 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"(注意逗号)。

所以最后回答这个问题:

于 2010-04-21T16:09:04.323 回答
3

即使确实如此。这对你有什么帮助?无论如何,我永远不会做出这个假设。您总是需要将两个操作数转换为相同的类型,以便至少知道您在比较什么。

于 2010-04-21T16:09:02.017 回答
0

大多数信誉良好的数据库都会对这种类型的查询进行隐式转换。可能有针对特定系统上的隐式转换的已发布规则 - 您必须查看供应商文档以了解在您的系统上进行了哪些隐式转换。

例如, 这里是 Microsoft 对 SQL Server 2000 的官方参考, 这里是关于 SQL Server 隐式转换的博客条目。

于 2010-04-21T16:16:42.697 回答
0

不。

我不知道为什么 Stackoverflow 要求我输入超过 3 个字符来回答这个问题。

于 2010-04-21T18:23:02.890 回答
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 回答