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只需要一行吗?是的,绝对可以。但是我在下面写的解决方案对我来说很好。我想我会采纳它。谢谢