SQL 中 1 总是等于“1”吗?
-
22-09-2019 - |
题
我试图确定将数字与同一数字的字符或字符串版本进行比较的标准 SQL 行为。做 SELECT 1 = '1'
(或类似)总是返回某种“真实”值(true
, 1
, 't'
, , ETC。)?我已经在 PostgreSQL 和 MySQL 上确认了很多,但我找不到整个 SQL 的资源。
更新: 这个问题的目的是我试图弄清楚在选择/插入/更新/等时使用不带引号的数字是否有效。来自值为数字的非数字字段。
解决方案
SELECT 1='1'
给TRUE
因为'1'
是已知的对我所有的实现INT
正确的构造。
但是SQL使用严格类型,请参阅:
# SELECT 1=CAST('1' AS TEXT);
ERROR: operator does not exist: integer = text
LINE 1: SELECT 1=CAST('1' AS TEXT);
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
关于标准(SQL 92,99 2003)这似乎是错误的:
<literal> ::=
<signed numeric literal>
| <general literal>
<general literal> ::=
<character string literal>
| <national character string literal>
| <bit string literal>
| <hex string literal>
| <datetime literal>
| <interval literal>
<signed numeric literal> ::=
[ <sign> ] <unsigned numeric literal>
<unsigned numeric literal> ::=
<exact numeric literal>
| <approximate numeric literal>
<exact numeric literal> ::=
<unsigned integer> [ <period> [ <unsigned integer> ] ]
| <period> <unsigned integer>
<unsigned integer> ::= <digit>...
<character string literal> ::=
[ <introducer><character set specification> ]
<quote> [ <character representation>... ] <quote>
[ { <separator>... <quote> [ <character representation>... ] <quote> }... ]
因为<quote>
仅包含在<bit string literal>
,<hex string literal>
,...但不在数字文字...
其他提示
SQL服务器
if 1 = '1'
print 'yes'
else
print 'no'
输出:是的
这将被转换,请参阅此处以获取隐式和显式转换可能性的完整列表: CAST 和 CONVERT (Transact-SQL)
首先,在SQL Server SELECT 1 = '1'
无效。尽管如此,如果你运行下面的代码,你会发现1做=“1”
if (1 = '1') begin
print 'true'
end else begin
print 'false'
end
结果:
true
"SQL
一般来说”没有“真实”值的概念。
不像 MySQL
和 PostgreSQL
, , 在 Oracle
和 SQL Server
, ,没有内部数据类型可以用作布尔值 WHERE
条款或 WHEN
谓词。
您应该始终在这些子句中使用某种谓词。
不能使用任何数据类型 mydata
为了使这些查询工作:
SELECT 1
WHERE @mydata
或者
SELECT 1
FROM dual
WHERE :mydata
另外,没有 SQL
标准规定了类型铸造顺序。
常量的数据类型可以转换为列数据类型的数据类型,反之亦然。
这可能会导致类似于中描述的问题 这个问题.
1是数量和“1”是某种类型的CHAR阵列,它们不应该是相等的。如果它们是依赖于实现的行为
从MySQL 5.x和SQL Server 2005的测试,他们都执行'1'
隐式转换为1
评价返回true。
但是,也有使用归类做。
虽然它似乎在许多实现中工作,每SQL标准,比较1 = '1'
是不允许的。
在问题(给定更新的文字)不如果:
SELECT 1 = '1'
将工作,但将:
SELECT '1'::text = 1
的工作。这当然是:不。至少,在PostgreSQL上,和一个非常好的理由。
从更新:
像你想做到以下几点你更新的声音:
SELECT *
FROM MyTable
WHERE StringColumn = 1
这将无法工作。如果在该字符串列其中非数值,任何值,只要SQL引擎获取到该行会抛出一个错误。 MS SQL Server中的错误是
“转换将varchar值 '嗒嗒' 转换为int数据类型。时失败”所以,如果你想要做比较,你必须确保你比较喜欢的数据类型。例如:
SELECT *
FROM MyTable
WHERE StringColumn = '1'
对于“总是为真” select语句简单地使用SELECT 1
。这将始终是真的。