我试图确定将数字与同一数字的字符或字符串版本进行比较的标准 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 一般来说”没有“真实”值的概念。

不像 MySQLPostgreSQL, , 在 OracleSQL 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。这将始终是真的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top