11

Postgresql 8.4を使用して、文字列が長すぎる場合に切り捨てに、空白で文字列を右パディングするにはどうすればよいですか?

問題は、文字列が実際にパディングする文字数よりも長い場合に文字列をrpad 切り捨てることです。例:

SELECT rpad('foo', 5);  ==> 'foo  ' -- fine
SELECT rpad('foo', 2);  ==> 'fo'    -- not good, I want 'foo' instead.

私が見つけた最短の解決策はまったく含まrpadれていません:

SELECT 'foo' || repeat(' ', 5-length('foo'));  ==> 'foo  ' -- fine
SELECT 'foo' || repeat(' ', 2-length('foo'));  ==> 'foo'   -- fine, too

しかし、これは醜い私見に見えます。もちろん、実際には文字列'foo'を選択するのではなく、列から選択することに注意してください。

SELECT colname || repeat(' ', 30-length(colname)) FROM mytable WHERE ...

よりエレガントな解決策はありますか?

4

5 に答える 5

14

もう少しエレガントな解決策を見つけました:

SELECT greatest(colname,rpad(colname, 2));

例えば:

SELECT greatest('foo',rpad('foo', 5));  -- 'foo  ' 
SELECT greatest('foo',rpad('foo', 2));  -- 'foo'  


それがどのように機能するかを説明するために:rpad('foo'、5)='foo' which is>'foo'(最大は文字列と数字で動作します)rpad('foo'、2)='fo' which is <' foo'なので、'foo'は最大の関数によって選択されます。

左に埋め込まれた単語が必要な場合は、左から右に比較されるため(たとえば、「oo」と「foo」)、最大に使用することはできません。場合によっては、文字列に応じてこれが大きくなったり小さくなったりします。文字列を逆にしてrpadを使用して元に戻すか、両方の場合に機能する元のソリューションを使用することができると思います。

于 2014-08-04T12:53:17.783 に答える
8

repeatそのビジネスをいつも書きたくないのなら、それのためにあなた自身の関数を書いてください。このようなもの:

create or replace function rpad_upto(text, int) returns text as $$
begin
    if length($1) >= $2 then
        return $1;
    end if;
    return rpad($1, $2);
end;
$$ language plpgsql;

またはこれ:

create or replace function rpad_upto(text, int) returns text as $$
select $1 || repeat(' ', $2 - length($1));
$$ language sql;

次に、次のように言うことができます。

select rpad_upto(colname, 30) from mytable ...

あなたはそれをしている間にあなたが何を作りたいかを考えたいかもしれませんrpad_upto(null, n)。上記の両方のバージョンは、がNULLのrpad_upto場合$1はNULLを返しますが、それらを微調整して、他の何かを問題なく返すことができます。

于 2012-08-27T19:26:17.027 に答える
4

これはどう

select case when length(col) < x then rpad(col, x)
else col
end
from table
于 2012-10-10T09:35:56.873 に答える
0

ここで効率が最大の関心事ではないと仮定します。

select regexp_replace(format('%5s', 'foo'), '(\s*)(\S*)', '\2\1')
  1. format()は、文字列を目的の幅に左パッドします
  2. 次に、regexp_replaceは先頭のスペースを最後に移動します。

文字列に先頭のスペースがあり、それらを保持したい場合は失敗すると思います。また、format()はnullパラメータでnullを返さないことに注意してください。

于 2015-05-06T19:37:12.713 に答える
0

以下のPostgreSQLステートメントは、3つの場所の値を右に埋め込み、列のデータ型を列'columnname'のテキストに変更することです。私はpycharmIDEを使用してステートメントを作成しました。ステートメントは000で埋められます。

左パッド以外は同じ問題を解決するためにしばらく探していましたが、共有したいと思いました。

alter table 'schema.tablename' alter column 'columnname' type text using rpad('columnname'::text,3,'0')
于 2020-01-10T19:16:30.177 に答える