SQL 仅返回第一个 TRUE 条件

Posted

技术标签:

【中文标题】SQL 仅返回第一个 TRUE 条件【英文标题】:SQL returns only for 1st TRUE condition 【发布时间】:2020-09-25 05:35:35 【问题描述】:

我有一个简单的查询,我只想返回一个值,以防多个条件中的第一个为真。

查询如下所示:

SELECT * FROM table
WHERE case column 
           when val1 then 1
           when val2 then 1
           when val3 then 1
      end = 1

在表中,可以是所有值(val1、val2 和 val3)的行,但不是强制性的,我只想返回条件为真的第一行并放弃其余条件。

对于我的 SQL 版本,select 语句返回所有 TRUE 条件的行。

请帮帮我。

【问题讨论】:

您的查询中缺少comaprisions(例如when val1 = 123 then 1 when val2 = 456 then 1 ...)。 在 SQL server Sql lite 上正常运行 @ThorstenKettner:我的 CASE 语句与以下情况相同:当 column = val1 then 1 when column = val2then 1 when column = val3 then 1 end = 1 哦,愚蠢的我。是的,我误读了这个。对不起。 【参考方案1】:

据我了解您的要求:您可以在不同的条件下找到匹配项。您只想返回最佳匹配行。

一个典型的例子是一个设置表,它可以包含一个国家、城市甚至地区的设置。如果可用,您需要地区设置,否则需要城市设置,并且只有在不可用时,您才会满足于全球国家/地区设置。

对于此类排名,您可以使用ROW_NUMBER。 IE。你给行编号,给出最佳匹配#1,第二好的#2,等等。然后你只保留排名#1的行。

select *
from
(
  select
    s.*,
    row_number() 
      over (order by case
             when s.country = :country
              and s.city = :city
              and s.district = :district then 1
             when s.country = :country
              and s.city = :city then 2
             else 3
            end) as rn
  from settings s
  where s.country = :country
)
where rn = 1;

在你的例子中:

select *
from
(
  select 
    t.*,
    row_number()
      over (order by case column when val1 then 1 when val2 then 2 else 3 end) as rn
  from table t
  where column in (val1, val2, val3)
)
where rn = 1;

如果可以有联系,即如果至少有一行匹配val1,则显示所有匹配val1的行等,然后使用RANKDENSE_RANK而不是ROW_NUMBER

从 Oracle 12c 开始,您还可以使用 FETCH 子句:

  select *
  from table
  where column in (val1, val2, val3)
  order by row_number()
             over (order by case column when val1 then 1 when val2 then 2 else 3 end)
  fetch first row only;

同样,如果您想允许平局,请使用 RANKDENSE_RANK 并将 FETCH FIRST ROW ONLY 替换为 FETCH FIRST ROW WITH TIES

【讨论】:

以上是关于SQL 仅返回第一个 TRUE 条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 查询中仅检查从存储过程返回的行的第一个值

“条件的长度 > 1,仅使用第一个元素”错误

SQL IN 子句仅返回以逗号分隔的 ID 列表中具有第一个匹配项的行

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-2 谓词

在 SQL redshift 中返回特定周的第一个日期(星期日)

数组元素查找方法对比