4

次の方法でいくつかのvarcharをクリーンアップする必要があります。

  1. !, @, #, $, %, ^, &, *, (, ), }, {, [, ], ",", ., ?, /, ',クローズドリストから:などの特殊文字を削除します。私はreplace\regexp_replaceを大量に使用してこれを行うことができましたが、SQLサーバーのものに似たものを探しています。

  2. 次の番号を削除しますが、隣接する番号は削除しません。

    round 1 --> round
    round1 --> round1
    round 12345 --> round
    round12345 --> round12345

  3. 「and」、「or」、「Ltd。」、「international」などの単語のクローズドリストからサブストリングなしで単語を削除します。

    more food or drinks ---> more food drinks. and not --> me food or drinks

私は大きなテーブルに取り組んでおり、可能な限り効率的にやりたいと思っています。
それを行う関数を書くべきですか、それとももっとエレガントな方法がありますか?

4

3 に答える 3

4

一緒に遊びます。質問 2は次のとおりです。

SELECT trim(regexp_replace(
   '12 foo1 run 1457 ABC 1Foo 2456 bar 34',
   '\s*\m\d+\M\s*',
   ' ',
   'g'
   ));

戻り値:

foo1 run ABC 1Foo bar

マニュアルに次のように記載されているため、ブラケット式の代わりに制約式を使用するように回答を更新しました。

以下に説明する制約エスケープは、通常は望ましいものです。それらはもはや標準ではありませんが、入力するのは簡単です。

\s*.. 0 個以上の空白
\m.. 単語の先頭 ( と同じ[[:<:]])
\d+.. 1 つ以上の数字
\M.. 単語の末尾 ( と同じ[[:>:]])

4 番目のパラメーター'g'は、最初の出現だけでなく、「グローバルに」置き換えるために必要です。

-> v9.2の sqlfiddle
-> v8.4の sqlfiddle は機能しません

なんで?

standard_conforming_strings. デフォルトは v9.1 で変更されました。

これは、いわば「互換モード」の両方の世界で機能します。しかし、上記の最新バージョンの構文 ( との組み合わせstandard_conforming_strings = on) はよりクリーンです。

SELECT trim(regexp_replace(
  '12 foo1 run 1457 ABC 1Foo 2456 bar 34',
  E'\\s*\\m\\d+\\M\\s*',
  ' ',
  'g'
));

->sqlfiddle

于 2013-01-19T10:09:18.233 に答える
4

1.次のように、許可リストにない文字をスペースに置き換える方がはるかに優れています。

select regexp_replace(
    E'aśx€ ąsd, dsa w|adwf\n  as dw dgaa[aw] asdd',
    '[^a-zA-Z0-9]',
    ' ',
    'g');

これは戻ります

a x   sd  dsa w adwf   as dw dgaa aw  asdd

Unicode には何千もの可能な文字があります。すべての特殊文字をリストすることは実際には不可能です。

読者への演習として残されている複数の連続するスペースを取り出します。

于 2013-01-19T09:51:02.463 に答える
2

3.最速の方法は次のとおりだと思います。

select regexp_replace(
  'And more food or drinks at the international airport Ltd',
  '[[:<:]](and|or|Ltd|international)[[:>:]]',
  ' ',
  'gi'
);

これは以下を返します:

 more food  drinks at the  airport

最初の回答でドットが除外されているため、それLtd.は本当に であると思います。Ltd

于 2013-01-19T10:50:20.693 に答える