Dav*_*542 3 sql types type-conversion database-agnostic language-lawyer
假设我有以下任一表达式:
SELECT
DATE '2014-01-01' < '2014-02-01',
DATE '2014-01-01' < '321',
9 < '10',
9 < 'a'
Run Code Online (Sandbox Code Playgroud)
SQL 标准中是否有关于如何比较这些的建议或要求?我想这三个级别或“严格性”如下:
似乎BigQuery使用第二种方法,postgres使用类似2/3的东西(只有最后一个失败),mysql使用3或4(没有失败)。
标准在这里有什么建议吗?
\n\n标准在这里有什么建议吗?
\n
我相信您是在问是否有关于自动类型转换进行比较的官方规则?答案是不*。
\n对于比较操作,规范提到数据类型应该是可比较的。没有描述不同数据类型的比较,但它确实说隐式类型转换可以发生在表达式 [...] 中。因此RDBMS允许转换一个或两个操作数的数据类型来比较它们。
\n话虽这么说,自动类型转换的规则取决于实现。不同 RDBMS 的规则差异很大。请查阅 RDBMS 文档以了解它们。
\n例如,SQL Server 使用数据类型优先级将其中一个操作数的数据类型转换为与另一个操作数匹配:
\nDATE \'2014-01-01\' < \'2014-02-01\',将转换为 varchar 值date进行比较9 < \'10\',将转换为 varchar 值int进行比较MySQL 有一套不同的规则:
\nDATE \'2014-01-01\' < \'2014-02-01\',两个值都将转换为时间戳(不是时间戳数据类型)以进行比较9 < \'10\',两个值都将转换为浮点数进行比较不幸的是,隐式转换有太多陷阱,应该避免。例如2.0 = \'2.01\',在 SQL Server 中是这样,2 = \'2foo\'在 MySQL 中也是这样。
在字符串上使用CAST正确类型 ( DECLARE @userdate AS DATE = \'20120201\') 的函数、变量或适当的函数 ( )。STR_TO_DATE(\'01-02-2012\',\'%d-%m-%Y\')
* 答案基于 SQL-92 标准 \xe2\x80\x94 ,非常古老,但仍然与问题相关。
\n| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |