程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如果没有匹配项,则选择第一条记录大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如果没有匹配项,则选择第一条记录?

开发过程中遇到如果没有匹配项,则选择第一条记录的问题如何解决?下面主要结合日常开发的经验,给出你关于如果没有匹配项,则选择第一条记录的解决方法建议,希望对你解决如果没有匹配项,则选择第一条记录有所启发或帮助;

较短(正确)

你实际上并不需要一个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等)没有BooleanPOSTGRes之类的适当类型,因此我们经常看到来自那些产品的人的错误建议。

您当前的查询(以及目前公认的答案), 需要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)SELECTUNION ALL则永远不会执行第二个SELECT。如果使用进行测试EXPLAIN ANALYZE,则会(never executed)在查询计划中看到。

评估 union all

回应戈登的评论。每个文档:

大胆强调我的。一旦找到足够的行 ,liMIT并使POSTGRes停止评估。这就是为什么您(never executed)在的输出中看到的原因EXPLAIN ANALYZE

如果ORDER BY在最终之前添加外部,liMIT则无法进行优化。然后,必须收集 所有 行以查看可能首先排序的行。

解决方法

postgresql中,我想根据某些条件选择一行,但是如果没有行与该条件匹配,则我想返回第一行。该表实际上包含一个序数列,因此该任务应该更容易(第一行是序数为0的那一行)。例如:

SELECT street,zip,city
FROM address
WHERE street LIKE 'Test%' OR ord = 0
LIMIT 1;

但是在这种情况下,无法保证匹配记录的顺序,因此我无对其进行排序。使用单个SELECT语句执行此操作的方式是什么?

大佬总结

以上是大佬教程为你收集整理的如果没有匹配项,则选择第一条记录全部内容,希望文章能够帮你解决如果没有匹配项,则选择第一条记录所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。