0

かなり一般的な接尾辞を削除して、データ フィールドを正規化しようとしています。postgres でsubstring()関数を使用することまではできましたが、うまく動作させることができません。たとえば、接尾辞「xyz」をそれを持つ値から削除したい場合。

UPDATE my_table SET my_field=substring(my_field from '#"%#"xyz' for '#');

しかし、これには特定できない奇妙な効果があります。何かご意見は?いつもありがとうございます。

4

2 に答える 2

1
UPDATE my_table
SET    my_field = left(my_field, -3)
WHERE  my_field LIKE '%xyz';

いくつかの理由で:

  • すべての行を変更したくない場合は、常にWHERE節を に追加してくださいUPDATE。式によって実際に一部の行のみが変更された場合でも。UPDATE同じ値から同じ値への変換は、依然として無効な行UPDATEとテーブルの肥大化とトリガー トリガーを生成します ...

  • left()と組み合わせて使用​​しLIKEます。

    • left()負の 2 番目のパラメーターを使用すると、文字列の末尾から文字数が効果的に削除されます。left()PostgreSQL 9.1 で導入されました。ここでマニュアルを引用します:

    n が負の場合、最後の |n| を除くすべてを返します。文字。

    • 可能であれば、常に LIKE正規表現 ( ~) を選択してください。LIKE汎用性は高くありませんが、はるかに高速です。(SIMILAR TO内部では正規表現に書き換えられています)。dba.SE に関するこの関連する回答の詳細。


最小限の文字が残るようにしたい場合:

WHERE  my_field LIKE '_%xyz'; -- prepend as many _ as you want chars left

substring()次のように動作します (1 つの可能性):

substring(my_field, '^(.*)xyz$');
于 2012-07-18T14:38:18.150 に答える
1
update my_table
   set my_field = regexp_replace(my_field, 'xyz$', '')
where my_field ~ 'xyz$';

これにより、値も'xyz'空の文字列に変更されます。あなたがそれを望んでいるかどうか(またはサフィックスが「単独で」存在できるかどうかはわかりません。

where 句は厳密には必要ありませんが、実際に基準を満たす行のみが更新されるため、更新がより効率的になります。

于 2012-07-18T14:38:47.150 に答える