1

DB から文字列を選択する必要があります。問題は、これらの文字列が不便な方法で DB に格納されることです。たとえば、私は持っています:

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

都市の名前を 1 つだけ取得する必要があります。この場合は「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

テスト DB を作成したところ、コードはほとんど機能します。

いくつかのことを確認してみてください:

  • トリム関数内:  、ただしデータ例: ;nbsp
  • 3 番目のテーブル (cities_other) のみの WHERE 条件 (published = '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 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 

3 つのソース テーブルからデータをUNION収集することは理にかなっていますが、とにかく重複を排除したいので、最後の(または) ステップで一度UNION ALL重複を使用して排除する方が高速な場合があります。既存のインデックス、重複の数、およびデータ分布に依存します。 でパフォーマンスをテストできます。GROUP BYDISTINCT
EXPLAIN ANALYZE

于 2013-06-26T13:32:03.937 に答える
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 に答える
0

ワイルドカードを使用します。

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