如何赋予完全匹配相对于部分匹配的权重(PostgreSQL)
我有一个查询,它使用输入在包含数万个条目的位置表(应该是美国几乎所有城市)中的zipcode/region/city/metrocode中搜索壁橱匹配项。我使用的查询是:如何赋予完全匹配相对于部分匹配的权重(PostgreSQL),sql,postgresql,where-clause,where,Sql,Postgresql,Where Clause,Where,我有一个查询,它使用输入在包含数万个条目的位置表(应该是美国几乎所有城市)中的zipcode/region/city/metrocode中搜索壁橱匹配项。我使用的查询是: select metrocode, region, postalcode, region_full, city from dv_location where ( region ilike '%Chicago%' or postalcode ilike '%Chicago%' or cit
select
metrocode,
region,
postalcode,
region_full,
city
from
dv_location
where
(
region ilike '%Chicago%'
or
postalcode ilike '%Chicago%'
or
city ilike '%Chicago%'
or
region_full ilike'%Chicago%'
)
and metrocode is not null
奇怪的是,我得到的结果集是这样的:
metrocode;region;postalcode;region_full;city
862;CA;95712;California;Chicago Park
862;CA;95712;California;Chicago Park
602;IL;60611;Illinois;Chicago
602;IL;60610;Illinois;Chicago
我做错了什么?我的想法是芝加哥将比芝加哥公园有更大的份量,因为芝加哥与术语完全匹配(尽管我要求对术语进行通配符匹配)。您可以在order by子句中明确设置顺序
...
order by
case
when city ilike 'Chicago' then 1
when city ilike 'Chicago%' then 2
when city ilike '%Chicago%' then 3
else 4
end
或者,无论您希望结果如何排序…请尝试以下操作:
select
metrocode,
region,
postalcode,
region_full,
city,
(region = 'Chicago'
OR postalcode = 'Chicago'
OR city = 'Chicago'
OR region_full = 'Chicago') AS full_match
from
dv_location
where
(
region ilike '%Chicago%'
or
postalcode ilike '%Chicago%'
or
city ilike '%Chicago%'
or
region_full ilike'%Chicago%'
)
and metrocode is not null
order by full_match desc;
请将您的输出格式化为代码。您真的得到了与该查询相同的重复行吗?或者这些唯一的行恰好与您选择的5个字段的值完全相同?根据您的查询,发布的结果非常有意义。你能添加一个你期望看到的例子吗?Phrogz:不,列的子集恰好是相同的。kevpie:我希望它在匹配“芝加哥公园”之前匹配“芝加哥”,但我可能误解了两边都有%的字符串是如何工作的。-穆太短了:简言之,是的。我要求它提供所有类似于“%Chicago%”的结果,从逻辑上讲,我会返回与该术语最接近的结果,但我的思维方式与PostgreSQL不同。=)@kagaku:如果不使用显式的
orderby
子句指定顺序,则结果集顺序是实现定义的(即,对于所有实际目的而言,与随机顺序一样好)。关系数据库和SQL是基于集合的(在数学意义上),因此没有隐式排序,必须显式指定排序。