sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで末尾のスペースをトリミングする

    目に見えない文字はたくさんあります。それらの多くには、プロパティ WSpace =Yがあります。 (「空白」)Unicodeで。ただし、一部の特殊文字は「空白」とは見なされず、表示されません。スペース(句読点)と空白文字に関する優れたウィキペディアの記事から、アイデアが得られるはずです。

    Unicodeはこの点でひどいです:主に人々を混乱させるのに役立つ多くのエキゾチックなキャラクターを紹介します。

    標準SQLのtrim() functionはデフォルトで、基本ラテンスペース文字(Unicode:U + 0020 / ASCII 32)のみをトリミングします。 rtrim()と同じ およびltrim() バリアント。また、あなたの電話はその特定のキャラクターのみを対象としています。

    regexp_replace()で正規表現を使用する 代わりに。

    追跡

    末尾の空白をすべて削除するには (ただし、内部の空白はありません 文字列):

    SELECT regexp_replace(eventdate, '\s+$', '') FROM eventdates;
    

    正規表現の説明:
    \ s ... [[:space:]]の正規表現クラスの省略形
    -空白文字のセットです-以下の制限を参照してください
    + ...1つ以上の連続した一致
    $ ...文字列の終わり

    デモ:

    SELECT regexp_replace('inner white   ', '\s+$', '') || '|'
    

    返品:

    inner white|
    

    はい、それはシングルです バックスラッシュ( \ )。この関連する回答の詳細:

    • SQLは列が\で始まる場所を選択します

    リーディング

    先頭の空白をすべて削除するには (ただし、文字列内の空白は含まれません):

    regexp_replace(eventdate, '^\s+', '')
    

    ^ ..文字列の開始

    両方

    両方を削除するには 、上記の関数呼び出しを連鎖させることができます:

    regexp_replace(regexp_replace(eventdate, '^\s+', ''), '\s+$', '')
    

    または、2つのブランチを使用して1回の呼び出しで両方を組み合わせることができます 。
    'g'を追加します 最初のパラメータだけでなく、すべての一致を置き換える4番目のパラメータとして:

    regexp_replace(eventdate, '^\s+|\s+$', '', 'g')
    

    ただし、通常は substring()を使用すると高速になります。 :

    substring(eventdate, '\S(?:.*\S)*')
    

    \ S ...すべてしかし 空白
    (?: re ...かっこをキャプチャしないセット
    。* ...0-n文字の任意の文字列

    またはこれらのいずれか:

    substring(eventdate, '^\s*(.*\S)')
    substring(eventdate, '(\S.*\S)')  -- only works for 2+ printing characters
    

    re ...括弧のセットをキャプチャする

    最初の非空白文字と、可能な場合は最後の非空白文字までのすべてを効果的に取得します。

    空白?

    Unicodeで「空白」として分類されていない関連文字がさらにいくつかあるため、文字クラス [[:space:]]には含まれていません。 。

    これらは、pgAdminで非表示のグリフとして出力されます:「モンゴル母音」、「ゼロ幅スペース」、「ゼロ幅非接合子」、「ゼロ幅ジョイナー」:

    SELECT E'\u180e', E'\u200B', E'\u200C', E'\u200D';
    
    '᠎' | '​' | '‌' | '‍'
    

    さらに2つ、可視として印刷 pgAdminのグリフですが、ブラウザには表示されません:「単語結合子」、「ゼロ幅の改行なしスペース」:

    SELECT E'\u2060', E'\uFEFF';
    '⁠' | ''
    

    最終的に、文字が非表示にされるかどうかは、表示に使用されるフォントにも依存します。

    これらすべてを削除するには 同様に、'\s'を置き換えます '[\s \ u180e \ u200B \ u200C \ u200D \ u2060 \ uFEFF]' または'[\s᠎‌‍⁠]' (末尾の非表示の文字に注意してください!)
    例:

    regexp_replace(eventdate, '\s+$', '')
    

    使用:

    regexp_replace(eventdate, '[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]+$', '')
    

    または:

    regexp_replace(eventdate, '[\s᠎​‌‍⁠]+$', '')  -- note invisible characters
    

    制限

    Posix文字クラス[[:graph:]]もあります 「目に見える文字」を表すことになっています。例:

    substring(eventdate, '([[:graph:]].*[[:graph:]])')
    

    これは、すべてのセットアップ( [\ x21- \ x7E] に要約されます)のASCII文字に対して確実に機能します。 )が、それを超えて、現在(pg 10を含む)は、基盤となるOSによって提供される情報に依存しています( ctype を定義するため)。 )および場合によってはロケール設定。

    厳密に言えば、これはすべての場合です。 文字クラスへの参照ですが、グラフのようなあまり一般的に使用されていないものとはより多くの不一致があるようです 。ただし、文字クラス [[:space:]]にさらに文字を追加する必要がある場合があります (省略形の \ s )すべての空白文字をキャッチします。いいね: \ u2007 \ u202f および\u00a0 @XiCoNJFSにも欠けているようです。

    マニュアル:

    角かっこ式内で、 [:で囲まれた文字クラスの名前 および:] そのクラスに属するすべての文字のリストを表します。標準の文字クラス名は次のとおりです。alnum alpha blank cntrl 数字グラフ lower print punct スペース upper xdigit 。これらは、ctypeで定義された文字クラスを表します。ロケールは他のクラスを提供できます。

    大胆な強調鉱山。

    Postgres 10で修正されたこの制限にも注意してください:

    大きな文字コード、特に U + 7FFより上のUnicode文字に対する正規表現の文字クラス処理を修正しました。 (トムレーン)

    以前は、このような文字は、 [[:alpha:]]などのロケール依存の文字クラスに属するものとして認識されていませんでした。 。



    1. SQLでゼロ除算エラーを回避するにはどうすればよいですか?

    2. MySQLデータベースが破損しています...どうすればよいですか?

    3. 合計を計算するための最良のアプローチ– SQLServer2012用に更新

    4. PDOを使用したデータベース内の行の一致に問題がある