Digits wie in DB2

Hi,

ich kenne von der IBM DB2 die Funktion DIGITS, damit kann ich von einem beliebigen numerischen Feld eine String-Variante mit der entsprechenden Anzahl Stellen (ggf. führende Nullen) bekommen. 123 in einem Numeric(5) würde 00123 liefern, bei Numeric(8) entsprechend 00000123. Ich habe zwar diverse Methoden gefunden, mit denen das hinzubekommen wäre (z. B. lpad(zahl::text, 8, ‘0’), allerdings muss ich dabei fest codieren, wieviel Stellen das Feld hat. Ändert sich die Spaltenlänge, muss ich Code anpassen :frowning: Wenn ich irgendwie die Stellenanzahl (Precision, Scale) ermitteln könnte, wäre mir schon geholfen. Anzahl Bytes oder pg_column_type helfen leider überhaupt nicht weiter.

Ich habe auch schon versucht, die Digits-Funktion mehrfach (z. B. einmal mit Numeric(3) und einmal Numeric(8)) anzulegen, aber das wird abgelehnt wegen identischer Argumenttypen…

Hat irgendwer einen Tipp? Habe ich etwas übersehen? Das DB2 to PostgreSQL Conversion Guide schweigt sich auch aus.

Danke & Gruß,
Christian

Via information_schema.columns kommt man an die notwendigen Informationen am leichtesten ran.

Eine Funktion die damit arbeitet könnte dann so aussehen:

create or replace function digits(p_tablename text, p_colname text, p_value numeric)
  returns text
  language plpgsql
as
$body$
declare 
   l_mask text;
begin 
  select lpad('0', numeric_precision, '0')||'FM'
    into l_mask
  from information_schema.columns
  where table_name = p_tablename
    and column_name = p_colname
    and table_schema = 'public';

  return to_char(p_value, l_mask);
end;
$body$

Und verwenden würde man sie so:

select id, digits('foobar', 'foo', foo)
from foobar;

Aber “hübsch” ist natürlich was anderes.

Hi,

danke für den Ansatz, aber hübsch ist tatsächlich etwas anderes :slight_smile: Zumal es nicht mit on-the-fly berechneten Werten funktioniert sondern ausschließlich mit bekannten Tabellenspalten umgehen kann. So ähnlich hatte ich es auch schon gelöst, aber die Hoffnung auf “die” Lösung noch nicht aufgegeben :wink:

Mein Ziel ist es, die SQL-Anweisung möglichst unverändert oder zumindest auf einfachem Weg automatisch konvertierbar zu machen: “codecompatibel” für DB2 und PG :sunglasses: