クエリ
SELECT COUNT(*), name, number
FROM tbl
GROUP BY name, number
HAVING COUNT(*) > 1
小文字と大文字の重複が見つからない場合があります。
例:重複として表示さsunny
れSunny
ないでください。
したがって、PostgreSQLで2つの列の重複の可能性をすべて見つける方法。
SELECT COUNT(*), name, number
FROM tbl
GROUP BY name, number
HAVING COUNT(*) > 1
小文字と大文字の重複が見つからない場合があります。
例:重複として表示さsunny
れSunny
ないでください。
したがって、PostgreSQLで2つの列の重複の可能性をすべて見つける方法。
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
その上に機能インデックスを作成することもできます。
PostgreSQLはデフォルトで大文字と小文字を区別します。すべての値を単一の大文字と小文字に変換することにより、検索中に大文字と小文字を区別しないように強制できます。
SELECT COUNT(*), lower(name), number FROM TABLE
GROUP BY lower(name), number HAVING COUNT(*) > 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)