我需要从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无法“即时”执行此操作。有什么想法吗?
答案 0 :(得分:2)
我刚刚创建了测试数据库,您的代码几乎可以正常工作!
尝试检查几件事:
你的意思是:
SELECT DISTINCT(LOWER(TRIM(city_name, ' '))) FROM cities_object WHERE published = '1'
UNION
SELECT DISTINCT(LOWER(TRIM(city_name, ' '))) FROM cities_firms WHERE published = '1'
UNION
SELECT DISTINCT(LOWER(TRIM(city_name, ' '))) 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%')