PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Funktionsaufruf

Das wird durch die Regeln der Funktionstypauflösung entschieden . Ausführliche Erklärung im Handbuch. Verwandte:

  • Gibt es eine Möglichkeit, das Überladen von Funktionen in Postgres zu deaktivieren

NULL ohne explizite Typumwandlung beginnt als Typ „unbekannt“:

SELECT pg_typeof(NULL)

 pg_typeof
-----------
 unknown

Eigentlich Ich wurde misstrauisch und führte einen Schnelltest durch, nur um unterschiedliche Ergebnisse in Postgres 9.3 und 9.4 zu finden. varchar wird über integer ausgewählt (was seltsamerweise widerspricht Ihren Erkenntnissen):

SQL-Geige.

Ich denke, die entsprechende Regel ist Punkt 4e in der Liste (keiner der früheren Punkte entscheidet das Match):

Wählen Sie an jeder Position die String-Kategorie aus, wenn ein Kandidat diese Kategorie akzeptiert. (Diese Ausrichtung auf Strings ist angemessen, da ein unbekanntes Literal wie ein String aussieht.)

Wenn Sie eine weitere Funktion mit Eingabe hinzugefügt haben, geben Sie text ein zum überladenen Mix, text würde über varchar ausgewählt werden .

Ich persönlich fast immer Verwenden Sie text statt varchar . Obwohl binärkompatibel (also fast, aber nicht ganz gleich), text ist in jeder Hinsicht näher am Herzen von Postgres.

Ich habe das der Geige hinzugefügt, sowie ein weiteres Beispiel, in dem Postgres sich nicht entscheiden kann und einen Wutanfall bekommt.

Wenn Sie eine bestimmte Funktion auswählen möchten, fügen Sie eine explizite Typumwandlung hinzu (so geht's hier!):

select test(null::int)     AS func_int
     , test(null::varchar) AS func_vc;