我有这个查询,使用postgre:
select *
from jobs
where short_name like '%GES.PAY%'
order by short_name;
返回此结果:
CRD.GES.PAY
GES.PAY
REL.GES.PAY
但是如何在结果的第一行添加'GES.PAY',像这样:
GES.PAY
CRD.GES.PAY
REL.GES.PAY
换句话说,我想要第一行的确切名称,然后是其他情况。有可能在一个简单的查询中做到这一点吗?而不使用“左芬汀”功能。
谢谢 Dom
答案 0 :(得分:1)
您可以执行条件排序:
order by
case when short_name = 'GES.PAY' then 0 else 1 end,
short_name
在Postgres中,您也可以表示为:
order by (short_name = 'GES.PAY')::int desc, short_name
后者之所以有效,是因为(condition)::int
如果满足条件,则返回1
,否则返回0
。
答案 1 :(得分:1)
我建议使用三元组索引和三元组距离运算符<->
:
CREATE EXTENSION pg_trgm;
CREATE INDEX ON jobs USING gist (short_name gist_trgm_ops);
SELECT *
FROM jobs
WHERE short_name LIKE '%GES.PAY%'
ORDER BY short_name <-> 'GES.PAY';
答案 2 :(得分:0)
我建议按字符串中值的位置进行存储:
order by position('GES.PAY' in short_name)
答案 3 :(得分:0)
您有几个不错的答案,但是我想抛出另一个答案。
order by length(short_name)
short_name的字母越少,在查询中的数字上可以包含的“多余”字母越少。