Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何赋予完全匹配相对于部分匹配的权重(PostgreSQL)_Sql_Postgresql_Where Clause_Where - Fatal编程技术网

如何赋予完全匹配相对于部分匹配的权重(PostgreSQL)

如何赋予完全匹配相对于部分匹配的权重(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

我有一个查询,它使用输入在包含数万个条目的位置表(应该是美国几乎所有城市)中的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

我做错了什么?我的想法是芝加哥将比芝加哥公园有更大的份量,因为芝加哥与术语完全匹配(尽管我要求对术语进行通配符匹配)。

您可以在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是基于集合的(在数学意义上),因此没有隐式排序,必须显式指定排序。