SQL的ORDER BY是否支持空字符串类似NULLS FIRST/LAST的排序语法?
问题解答
- 目前标准SQL以及所有主流SQL方言,仅支持针对NULL值的
NULLS {FIRST | LAST}排序快捷语法,没有原生针对空字符串的同类扩展语法。
出现这个差异的核心原因是:NULL是SQL三值逻辑体系下的特殊值,不属于任何数据类型的正常值范围,不同数据库默认的NULL排序规则差异极大(比如Oracle默认NULL排最后,PostgreSQL默认NULL排最前),因此才推出了NULLS FIRST/LAST的通用扩展语法统一行为。而空字符串本质是字符串类型的合法正常值,和'a'、'test'这类普通字符串没有本质区别,属于常规字符串排序的覆盖范围,因此各大方言都没有为其单独设计语法糖。
你需要的排序效果可以通过在ORDER BY子句中增加优先级判断表达式实现,写法兼容绝大多数SQL方言:
需求1:NULL排最前,非空非空字符串按正序排列,空字符串排最后
ORDER BY CASE WHEN name IS NULL THEN 0 WHEN name != '' THEN 1 ELSE 2 END ASC, name ASC
执行后输出的排序结果和你预期完全一致:
NULL "alex" "tom" "zack" ""
需求2:非空非空字符串按正序排列,NULL和空字符串都排最后,且NULL排在空字符串之前
ORDER BY CASE WHEN name IS NOT NULL AND name != '' THEN 0 WHEN name IS NULL THEN 1 ELSE 2 END ASC, name ASC
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

