7

クエリ

SELECT COUNT(*), name, number
FROM   tbl
GROUP  BY name, number
HAVING COUNT(*) > 1

小文字と大文字の重複が見つからない場合があります。
例:重複として表示さsunnySunnyないでください。
したがって、PostgreSQLで2つの列の重複の可能性をすべて見つける方法。

4

3 に答える 3

18

lower()/upper()

これらのいずれかを使用して、文字を小文字または大文字に折ります。特殊文字は影響を受けません:

SELECT count(*), lower(name), number
FROM   tbl
GROUP  BY lower(name), number
HAVING count(*) > 1;

unaccent()

コメントが示すように、発音区別符号を実際に無視したい場合は、追加のモジュールをインストールしてください。このモジュールunaccentは、アクセントと汎用関数を削除するテキスト検索辞書を提供しますunaccent()

CREATE EXTENSION unaccent;

非常にシンプルになります。

SELECT lower(unaccent('Büßercafé'));

結果:

busercafe

これは非文字を削除しません。regexp_replace()そのために言及された@Craigのように追加します:

SELECT lower(unaccent(regexp_replace('$s^o&f!t Büßercafé', '\W', '', 'g') ));

結果:

softbusercafe

その上に機能インデックスを作成することもできます。

于 2012-10-19T17:36:25.693 に答える
4

PostgreSQLはデフォルトで大文字と小文字を区別します。すべての値を単一の大文字と小文字に変換することにより、検索中に大文字と小文字を区別しないように強制できます。

SELECT COUNT(*), lower(name), number FROM TABLE 
GROUP BY lower(name), number HAVING COUNT(*) > 1
  • :これはPostgresではテストされていません
于 2012-10-19T17:36:38.780 に答える
1

(ポスターからの説明後に更新された回答):「アクセントを外す」またはアクセント(ディクラティックス)を取り除くという考えは、一般的に偽物です。résumé誤った方向に進んだユーザーやアプリケーションが侵入したかどうかを調べるためにデータを照合する場合は問題ありませんがresume、単語が異なるため、一方を他方に変更することはまったく間違っています。それでも、それは一種の作業にすぎず、トリグラムレーベンシュタイン距離などの文字列類似性マッチングシステムと組み合わせる必要があります。

「アクセントなし」の概念は、アクセント付き文字が1つの有効な同等のアクセントなし文字を持っていること、または少なくとも、任意のアクセント付き文字が、単語のASCII表現で最大1つのアクセントなし文字に置き換えられることを前提としています。それは単に真実ではありません。ある言語öでは「u」の音であるかもしれませんが、別の言語では長い「oo」である可能性があり、「ASCII化された」スペル規則はそれを反映している可能性があります。したがって、言語では、作成されたダミー単語「Tapö」の正しい「アクセントなし」は「Tapu」であり、別の言語では、この架空の単語は「Tapoo」に関連付けられている可能性があります。どちらの場合も、「アクセントのない」形式の「タポ」は、ASCII文字セットに強制されたときに人々が実際に書くものと一致しません。

これは英語で合字で見ることができ、単語dæmonはASCII化されてdaemonいます。dmon一致しない合字を削除した場合daemon、一般的なスペルです。同じことが当てはまり、æther通常はaetherまたはに関連付けられetherます。これは、ドイツ語でßを使用して表示することもできます。通常は「展開」されssます。

「アクセントを外す」、「正規化する」、または「ストリップする」アクセントを試みる必要がある場合:

文字クラスの正規表現を使用して、指定された文字セットを除くすべての文字を取り除くことができます。この場合、\Wエスケープ([^[:alnum:]_] マニュアルによる文字クラスの省略形)を使用して、「記号」を除外しますが、アクセント付き文字は除外しません。

regress=# SELECT regexp_replace(lower(x),'\W','','g') 
          FROM ( VALUES ('$s^o&f!t'),('Café') ) vals(x);
 regexp_replace 
----------------
 soft
 café
(2 rows)

アクセント付きの文字も除外したい場合は、独自の文字クラスを定義できます。

regress=# SELECT regexp_replace(lower(x),'[^a-z0-9]','','g')
          FROM ( VALUES ('$s^o&f!t'),('Café') ) vals(x);
 regexp_replace 
----------------
 soft
 caf
(2 rows)

アクセントのある文字を同様のアクセントのない文字に置き換えることを実際に意図している場合は、このwikiの記事translateに従って使用できます。

regress=# SELECT translate(
        lower(x),
        'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ',
        'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu'
    )
    FROM ( VALUES ('$s^o&f!t'),('Café') ) vals(x);

 translate 
-----------
 $s^o&f!t
 cafe
(2 rows)
于 2012-10-22T11:08:01.863 に答える