SQL标准对字符串与非字符串类型比较有何规范要求?
SQL标准中跨类型比较的规范说明
先看你给出的示例查询:
SELECT DATE '2014-01-01' < '2014-02-01', DATE '2014-01-01' < '321', 9 < '10', 9 < 'a'
针对这类不同数据类型间的比较,SQL标准有明确的强制规则,核心逻辑如下:
- 定义了类型优先级顺序:日期/时间类型 > 数值类型 > 字符串类型。
- 跨类型比较时,必须尝试将低优先级的类型转换为高优先级的类型。比如日期和字符串比较时,先把字符串转为日期;数值和字符串比较时,先把字符串转为数值。
- 如果转换失败(比如字符串无法解析为目标类型),标准强制要求抛出错误,这对应你提到的第2种处理方式。
不同数据库的实际实现存在差异:
- BigQuery:严格遵循标准规则,转换失败直接报错,完全符合第2种方式。
- PostgreSQL:基本贴合标准,但细节上有微调——数值与可解析为数值的字符串比较会成功,与不可解析的字符串(如
'a')比较则报错;日期与非日期格式的字符串比较直接报错,最终仅9 < 'a'执行失败,接近第2种方式。 - MySQL:采用宽松的扩展规则,转换失败时会自动回退为字符串比较(或直接将非字符串转为字符串),因此所有表达式都能执行成功,对应你说的第3/4种方式。
总结:SQL标准明确要求跨类型比较时按优先级转换,转换失败则报错,即第2种处理方式是标准强制的。各数据库的差异是厂商对标准的不同实现或自定义扩展。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

