大佬教程收集整理的这篇文章主要介绍了如果没有匹配项,则选择第一条记录,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
你实际上并不需要一个WHERE
条款 都 :
SELECT street, zip, city
FROM address
ORDER BY street !~~ 'Test%', ord
liMIT 1;
!~~
只是POSTGRes运算符的NOT liKE
。您可以使用任何一个。请注意,通过反转逻辑(NOT
liKE
而不是liKE
),我们现在可以使用默认的ASC
排序顺序和NulL最后排序,这可能很重要。继续阅读。
这更短(但不一定更快)。它也与@Gordon当前接受的答案稍有不同(更可靠)。
当前接受的答案使用ORDER BY <Boolean Expression> DESC
,它将首先对NulL进行排序。
如果street
定义NOT NulL
这显然是不相关的,但是这并 没有 在这个问题被定义。( 始终
提供表定义。)当前接受的答案通过在WHERE
子句中排除NulL值来避免此问题。
其他一些RDBMS(MysqL,Oracle等)没有Boolean
POSTGRes之类的适当类型,因此我们经常看到来自那些产品的人的错误建议。
您当前的查询(以及目前公认的答案), 需要 的WHERE
条款-或者至少NulLS LAST
。对于不同的表达,ORDER
BY
两者都不是必需的。
是,如果多行具有匹配项street
(这是可以预期的),则返回的行将是任意的,并且可能在调用之间发生变化-
通常是不希望有的结果。该查询选择ord
要打破平局的关系最小的行,并产生稳定的结果。
这种形式也更加灵活,因为它不依赖于带有的行的存在ord = 0
。取而代之的ord
是,选择最小的行。
(并且仍然正确。)对于大表,以下索引可以从根本上提高此查询的性能:
CREATE INDEX address_street_pattern_ops_IDx ON address(street text_pattern_ops);
根据未定义的详细信息,可能需要向索引中添加更多列。 使用此索引的最快查询:
(
SELECT street, zip, city
FROM address
WHERE street liKE 'Test%'
ORDER BY ord -- or something else?
-- liMIT 1 -- you *Could* add liMIT 1 in each leg
)
union all
(
SELECT street, zip, city
FROM address
ORDER BY ord
-- liMIT 1 -- .. but that's not improving anything in *this* case
)
liMIT 1
顺便说一句,这是一个 单一的 声明。
这比较冗长,但允许使用更简单的查询计划。如果第一个产生足够多的行(在我们的示例中为1)SELECT
,UNION
ALL
则永远不会执行第二个SELECT
。如果使用进行测试EXPLAIN ANALYZE
,则会(never executed)
在查询计划中看到。
union all
回应戈登的评论。每个文档:
大胆强调我的。一旦找到足够的行
,liMIT
并使POSTGRes停止评估。这就是为什么您(never executed)
在的输出中看到的原因EXPLAIN ANALYZE
。
如果ORDER BY
在最终之前添加外部,liMIT
则无法进行优化。然后,必须收集 所有 行以查看可能首先排序的行。
以上是大佬教程为你收集整理的如果没有匹配项,则选择第一条记录全部内容,希望文章能够帮你解决如果没有匹配项,则选择第一条记录所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。