选择DISTINCT和TRIM即时

时间:2013-06-26 09:29:48

标签: postgresql distinct

我需要从DB中选择一些字符串。问题是这些字符串以某种不方便的方式存储在DB中。例如,我有:

| "Kraków" 
| "Kraków " 
| "KRAKÓW"

我必须得到这个城市的唯一名字 - 在这种情况下:“克拉科夫”。城市名称存储在几个表格中。

我尝试过类似的东西:

SELECT DISTINCT(LOWER(TRIM(city_name, ' '))) FROM cities_object UNION DISTINCT
        SELECT DISTINCT(LOWER(TRIM(city_name, ' '))) FROM cities_firms UNION  DISTINCT 
        SELECT DISTINCT(LOWER(TRIM(city_name, ' '))) FROM cities_other UNION  DISTINCT 
        WHERE
            published = '1'

但这不起作用。我认为这是因为SQL无法“即时”执行此操作。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

我刚刚创建了测试数据库,您的代码几乎可以正常工作!

尝试检查几件事:

  • 内部修剪功能:& nbsp,但在您的数据示例中:; nbsp
  • WHERE条件(已发布='1')仅适用于第三个表(cities_other)
  • 太多“不同”的陈述;)

你的意思是:

SELECT DISTINCT(LOWER(TRIM(city_name, '&nbsp'))) FROM cities_object WHERE published = '1'
UNION
SELECT DISTINCT(LOWER(TRIM(city_name, '&nbsp'))) FROM cities_firms WHERE published = '1'
UNION
SELECT DISTINCT(LOWER(TRIM(city_name, '&nbsp'))) FROM cities_other WHERE published = '1';

...如果这仍然无济于事,请尝试给我们提供错误信息。 : - )

答案 1 :(得分:1)

select distinct
    lower(
        regexp_replace(city_name, '^ | $', '', 'g')
    ) city_name
from (
    select city_name from cities_object
    where published = '1'
    union
    select city_name from cities_firms
    where published = '1'
    union
    select city_name from cities_other
    where published = '1'
) s

答案 2 :(得分:1)

SELECT replace(lower(city_name), ';nbsp', '') AS city_name
FROM  (
    SELECT city_name FROM cities_object WHERE published = '1'
    UNION ALL
    SELECT city_name FROM cities_firms  WHERE published = '1'
    UNION ALL
    SELECT city_name FROM cities_other  WHERE published = '1'
    ) sub
GROUP  BY 1

replace()删除字符串中任何位置的;nbsp。它没有regexp_replace()那么强大,但速度要快得多。 lower()之后将放置,以替换;NBSP 但你确定你的人工制品是;nbsp,而不是 吗?

尽管UNION从三个源表中收集数据是有意义的,但由于您希望无论如何都要消除重复数据,因此使用UNION ALL并消除重复 一次可能会更快GROUP BY(或DISTINCT)步骤中的em> 。取决于现有指数,重复数量和数据分布 您可以使用EXPLAIN ANALYZE来测试效果。

答案 3 :(得分:0)

使用通配符。

WHERE FirstName LIKE LOWER('Kraków%')