【发布时间】:2020-01-18 22:11:11
【问题描述】:
到目前为止我的代码
SELECT * FROM gp
WHERE status IN ('priority', NULL)
AND (status='priority' OR EXISTS(SELECT * FROM gp WHERE status IS NULL))
LIMIT 1
我正在尝试使用status = 'priority' 获取第一行(如果存在),或者使用status = NULL 获取第一行。状态可能还有其他值,但我只想先获得priority(如果可用),然后是NULL。
到目前为止,我的代码所做的是,当它们存在时,它返回带有 status = 'priority' 的行,但在仅存在 NULLs 时不返回任何内容。
【问题讨论】:
-
如果我使用 ORDER BY,它必须是 DESC 才能在 NULL 之前获得“优先级”。但是使用 DESC,我也可以先获得最后一个“优先级”或 NULL。
-
什么定义了“第一”行?
-
它们被导入的顺序 - id 的顺序。正常的 ASC 顺序
-
记住:根据定义,数据库表是无序的。如果您没有
ORDER BYsomewhere,事情可能似乎会以稳定、合理的排序顺序返回,但这只是因为它对数据库很方便现在。然后有一天,您可以添加一个新索引,或者一个补丁添加了您在其他数据库中看到的循环性能优化,或者维护工作重新排序磁盘上的页面。突然之间,旧的排序不再是最方便的选择,您的查询中断了。或者更确切地说,您发现您的查询总是被破坏,而您只是侥幸逃脱。 -
第二部分。我看到了这个:
The order they were imported in - order of the id's。这也是不可靠。有些东西可以改变这些 ID 的默认顺序。如果这个顺序真的很重要,您应该考虑添加一列来捕获创建记录时的时间戳。
标签: mysql sql sql-order-by