在执行 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 中某列具有特定值的数据行?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Postgres 函数作为 ActiveRecord 模型