在执行 Select 查询时,如何忽略 Postgresql 中某列具有特定值的数据行?

Posted

技术标签:

【中文标题】在执行 Select 查询时,如何忽略 Postgresql 中某列具有特定值的数据行?【英文标题】:When doing a Select query how do I ignore rows of data with a certain value for a column in Postgresql? 【发布时间】:2017-01-30 19:09:57 【问题描述】:

所以当我通过某一列查询时我有数据,有时会返回不止一行,因为另一列不同。假设当第二列具有某个值但仅当另一行中存在其他值时,我想忽略某些行。下面是一个例子

Name    Color
Tom     Blue
Tom     Red
Frank   Red

所以说,当我在 Name 列下查询时,值是 Tom,我得到两行,其中一行的颜色为蓝色,另一行为红色。假设我只对蓝色感兴趣,所以我想忽略以红色为值的行,但是只有当每个名称有多个 Color 实例时才如此。因此,例如,如果我在 Frank 下按 Name 查询,我不想仅仅因为颜色是红色而忽略该行。希望这是有道理的。

【问题讨论】:

你喜欢什么颜色?我的意思是,当你选择汤姆时,如何选择蓝色或红色? 所以在我给出的例子中,当 Tom 被选中时,蓝色是首选 【参考方案1】:

根据需要的优先级有条件地使用 ROW_NUMBER 种颜色,例如,如果首选“蓝色”

select Name,Color 
from (
    select *, row_number() over(partition by name order by case color
                                when 'Red' then 2 
                                when 'Blue' then 1 end) rn
from dd
) t
where rn = 1   

当您需要除“红色”之外的所有颜色时,只有“红色”是唯一的颜色

select Name,Color 
from (
    select *, count(*) over (partition by name) as cnt
    from (
      /* example data*/
        select 'Tom' as Name,  'Blue' as Color
        union all
        select 'Tom' ,'Red'
        union all
        select 'Tom' ,'Green'
        union all
        select 'Frank' ,'Red'
        )dd
) t
where cnt = 1 or Color !='Red'

【讨论】:

好吧,如果我不知道蓝色是一个值怎么办。因为它可能是绿色、蓝色、橙色等,但我希望这些颜色在不知道指定实际值的情况下排在红色之前。【参考方案2】:

我不确定这是否是您正在寻找的答案,但简单的方法是将结果限制为一条记录:

select Name, Color
from yourTable
where Name = 'Tom'
limit 1;

如果需要获取更多记录,可以使用 CTE 添加行号,获取行号 = 1 的记录

with res as
(
    select Name, Color, row_number() over (partition by name) RN
    from yourTable
)
select Name, Color
from res
where RN = 1;

【讨论】:

【参考方案3】:

我认为这就是您正在寻找的内容,它只会选择名称为 Tom 和颜色为 Blue 的值。

SELECT * FROM Table WHERE (Name = 'Tom') AND (Color = 'Blue')

【讨论】:

以上是关于在执行 Select 查询时,如何忽略 Postgresql 中某列具有特定值的数据行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL Server中选择特定日期的行,忽略时间。

如何在 SQLite 查询中忽略重音(Android)

使用 Postgres 函数作为 ActiveRecord 模型

如何使用 Oracle 正确执行 SELECT 查询的性能测试?

忽略特定查询的 TransactionScope

如何忽略 MYSQL SELECT LIKE %...% 上的字符