1

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

| "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

4 回答 4

2

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

尝试检查几件事:

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

你的意思:

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';

?

...如果这仍然没有帮助,请尝试向我们提供您收到的错误消息。:-)

于 2013-06-26T09:50:02.970 回答
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
于 2013-06-26T11:28:15.217 回答
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 BYDISTINCT
EXPLAIN ANALYZE

于 2013-06-26T13:32:03.937 回答
0

使用通配符。

WHERE FirstName LIKE LOWER('Kraków%')
于 2013-06-26T09:34:27.913 回答