我正在尝试确定用于将数字与相同数字的字符或字符串版本进行比较的标准SQL行为。 SELECT 1 = '1'
(或类似)总是会返回某种“真实”价值(true
,1
,'t'
等等吗?我已经在PostgreSQL和MySQL上做了很多确认,但是我找不到整个SQL的资源。
更新:问题的目的是我试图弄清楚在选择/插入/更新/等时使用不带引号的数字是否有用。来自非数字字段,其值为数字。
答案 0 :(得分:6)
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>
中,但不包含在数字文字中......
答案 1 :(得分:2)
SQL Server
if 1 = '1'
print 'yes'
else
print 'no'
输出:是
这会被转换,请参阅此处获取隐式和显式转换可能性的完整列表:CAST and CONVERT (Transact-SQL)
答案 2 :(得分:2)
首先,在SQL Server SELECT 1 = '1'
中无效。虽然,如果你运行以下代码,你会发现1做='1'
if (1 = '1') begin
print 'true'
end else begin
print 'false'
end
结果:
true
答案 3 :(得分:2)
“SQL
一般来说”没有“真实”价值的概念。
与MySQL
和PostgreSQL
不同,在Oracle
和SQL Server
中,没有内部数据类型可以用作WHERE
子句中的布尔值或{{1}谓词。
你应该总是在这些子句中使用某种谓词。
WHEN
中无法使用任何数据类型来使这些查询有效:
mydata
或
SELECT 1
WHERE @mydata
此外,没有SELECT 1
FROM dual
WHERE :mydata
标准规定了类型转换顺序。
常量的数据类型可以转换为列数据类型的数据类型,反之亦然。
这可能会导致类似this question中描述的问题。
答案 4 :(得分:1)
1是一个数字,'1'是某种类型的CHAR数组,它们永远不应该相等。如果它们是依赖于实现的行为
答案 5 :(得分:1)
从MySQL 5.x和SQL Server 2005进行测试,它们都执行'1'
到1
的隐式转换,以使评估返回true。
但这也可能与整理有关。
答案 6 :(得分:0)
虽然它似乎在许多实现中都有效,但根据SQL标准,不允许进行比较1 = '1'
。
答案 7 :(得分:0)
问题(给定更新文本)不是:
SELECT 1 = '1'
会起作用,但会:
SELECT '1'::text = 1
的工作。这当然是:不。至少在PostgreSQL上,并且有一个很好的理由。
答案 8 :(得分:0)
来自更新:
您的更新听起来像是要执行以下操作:
SELECT *
FROM MyTable
WHERE StringColumn = 1
那不行。如果该字符串列中的任何值都是非数字的,则只要sql引擎到达该行,就会抛出错误。在MS SQL Server中,错误是“转换失败时将varchar值'blah'转换为数据类型int。”
因此,如果您想进行比较,则必须确保比较类似的数据类型。例如:
SELECT *
FROM MyTable
WHERE StringColumn = '1'
答案 9 :(得分:-1)
对于“始终为true”的select语句,只需使用SELECT 1
即可。这将永远是真的。