如何通过部分匹配赋予完全匹配权重(PostgreSQL)

时间:2011-01-05 02:31:23

标签: 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
  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

我做错了什么?我的想法是,芝加哥比芝加哥公园更重要,因为芝加哥与这个词完全匹配(即使我要求在这个词上进行通配符匹配)。

2 个答案:

答案 0 :(得分:2)

您可以在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

或者您希望订购结果......

答案 1 :(得分:2)

试试这个:

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;