Postgresql ORDER BY表达式必须出现在选择列表中

Postgresql ORDER BY表达式必须出现在选择列表中,postgresql,Postgresql,我有一个疑问: select j.id, j.short_name, j.status from jobs as j inner join job_translations as jt on j.id = jt.job_id where j.deleted_at is null and short_name ilike '%GES.PAY%' order by case when j.short_name = 'GES.PAY' then 0 else 1 end, j.short_nam

我有一个疑问:

select j.id, j.short_name, j.status
from jobs as j inner join job_translations as jt on j.id = jt.job_id 
where j.deleted_at is null 
and short_name ilike '%GES.PAY%' 
order by case when j.short_name = 'GES.PAY' then 0 else 1 end, j.short_name;
它返回:

468883c1-1d3b-420f-b59f-ff71fdbc7a20    GES.PAY DRAFT
468883c1-1d3b-420f-b59f-ff71fdbc7a20    GES.PAY DRAFT
468883c1-1d3b-420f-b59f-ff71fdbc7a20    GES.PAY DRAFT
3404aee7-ff88-47eb-9a51-dc255935384e    CRD.GES.PAY DRAFT
3404aee7-ff88-47eb-9a51-dc255935384e    CRD.GES.PAY DRAFT
3404aee7-ff88-47eb-9a51-dc255935384e    CRD.GES.PAY DRAFT
d2caa1f5-dcaf-4f14-b3f0-bc67d46cc8a3    REL.GES.PAY DRAFT
d2caa1f5-dcaf-4f14-b3f0-bc67d46cc8a3    REL.GES.PAY DRAFT
d2caa1f5-dcaf-4f14-b3f0-bc67d46cc8a3    REL.GES.PAY DRAFT
ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 5: order by case when j.short_name = 'GES.PAY' then 0 else 1 en...
太好了

我想应用一个类似的distinct(请参见“distinct”关键字):

它返回:

468883c1-1d3b-420f-b59f-ff71fdbc7a20    GES.PAY DRAFT
468883c1-1d3b-420f-b59f-ff71fdbc7a20    GES.PAY DRAFT
468883c1-1d3b-420f-b59f-ff71fdbc7a20    GES.PAY DRAFT
3404aee7-ff88-47eb-9a51-dc255935384e    CRD.GES.PAY DRAFT
3404aee7-ff88-47eb-9a51-dc255935384e    CRD.GES.PAY DRAFT
3404aee7-ff88-47eb-9a51-dc255935384e    CRD.GES.PAY DRAFT
d2caa1f5-dcaf-4f14-b3f0-bc67d46cc8a3    REL.GES.PAY DRAFT
d2caa1f5-dcaf-4f14-b3f0-bc67d46cc8a3    REL.GES.PAY DRAFT
d2caa1f5-dcaf-4f14-b3f0-bc67d46cc8a3    REL.GES.PAY DRAFT
ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 5: order by case when j.short_name = 'GES.PAY' then 0 else 1 en...

我做了很多事情都没有成功。我如何才能做到这一点?

我找到了这样的解决方案:

select distinct j.id, j.short_name, j.status, case when j.short_name = 'GES.PAY' then 0 else 1 end
from jobs as j inner join job_translations as jt on j.id = jt.job_id 
where j.deleted_at is null 
and short_name ilike '%GES.PAY%' 
order by case when j.short_name = 'GES.PAY' then 0 else 1 end, j.short_name;

所有列都必须出现在select中(写入错误消息…)。很抱歉给您带来不便…

我找到了这样的解决方案:

select distinct j.id, j.short_name, j.status, case when j.short_name = 'GES.PAY' then 0 else 1 end
from jobs as j inner join job_translations as jt on j.id = jt.job_id 
where j.deleted_at is null 
and short_name ilike '%GES.PAY%' 
order by case when j.short_name = 'GES.PAY' then 0 else 1 end, j.short_name;
select distinct (j.id, j.short_name, j.status)
from jobs as j inner join job_translations as jt on j.id = jt.job_id 
where j.deleted_at is null 
and short_name ilike '%GES.PAY%' 
order by case when j.short_name = 'GES.PAY' then 0 else 1 end, j.short_name;
所有列都必须出现在select中(写入错误消息…)。很抱歉给您带来不便

select distinct (j.id, j.short_name, j.status)
from jobs as j inner join job_translations as jt on j.id = jt.job_id 
where j.deleted_at is null 
and short_name ilike '%GES.PAY%' 
order by case when j.short_name = 'GES.PAY' then 0 else 1 end, j.short_name;
ORDER BY子句不能在DISTINCT之前应用,只能在DISTINCT应用之后应用。对于不同的操作,只考虑SELECT语句中的字段,这些字段是ORDER BY中可以使用的唯一字段


ORDER BY子句不能在DISTINCT之前应用,只能在DISTINCT应用之后应用。只有SELECT语句中的字段才被考虑用于DISTINCT操作,这些是ORDER BY中可以使用的唯一字段。

您可以将DISTINCT放入派生表(也称为子查询)中,然后在外部查询中应用ORDER BY:

select *
from (
  select distinct j.id, j.short_name, j.status
  from jobs as j 
    inner join job_translations as jt on j.id = jt.job_id 
  where j.deleted_at is null 
    and short_name ilike '%GES.PAY%' 
)    
order by case 
           when short_name = 'GES.PAY' then 0 
           else 1 
         end, 
         short_name;
如果您想选择唯一id,还可以使用
distinct on()


您可以将distinct放入派生表(也称为子查询),然后在外部查询中应用order by:

select *
from (
  select distinct j.id, j.short_name, j.status
  from jobs as j 
    inner join job_translations as jt on j.id = jt.job_id 
  where j.deleted_at is null 
    and short_name ilike '%GES.PAY%' 
)    
order by case 
           when short_name = 'GES.PAY' then 0 
           else 1 
         end, 
         short_name;
如果您想选择唯一id,还可以使用
distinct on()


distinct
不是一个函数。您的查询返回一个列,该列是一个匿名记录类型,具有三个字段。谢谢你的回复。当我添加()时,出现了相同的错误消息。您的解决方案不起作用…
distinct
不是一个函数。您的查询返回一个列,该列是一个匿名记录类型,具有三个字段。谢谢你的回复。当我添加()时,出现了相同的错误消息。您的解决方案不起作用…每个ID只需要一行吗?是的,绝对可以。但是我在下面写的解决方案对我来说很好。我想我会采纳它。谢谢你每个ID只需要一行吗?是的,绝对可以。但是我在下面写的解决方案对我来说很好。我想我会采纳它。谢谢