如何使用LIKE进行偏好查询?

时间:2019-12-13 09:53:54

标签: sql postgresql sql-order-by

我有这个查询,使用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

4 个答案:

答案 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的字母越少,在查询中的数字上可以包含的“多余”字母越少。