PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Chiamata di funzione PostgreSQL

Ciò è deciso dalle regole di Risoluzione del tipo di funzione . Spiegazione dettagliata nel manuale. Correlati:

  • C'è un modo per disabilitare il sovraccarico delle funzioni in Postgres

NULL senza il cast di tipo esplicito inizia come tipo "sconosciuto":

SELECT pg_typeof(NULL)

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

In realtà, Mi sono insospettito ed ho eseguito un rapido test, solo per trovare risultati diversi in Postgres 9.3 e 9.4. varchar viene selezionato su integer (che stranamente contraddice le tue scoperte):

SQL Fiddle.

Penso che la regola corrispondente sia il punto 4e nell'elenco (nessuno dei punti precedenti decide la corrispondenza):

In ogni posizione, seleziona la categoria della stringa se un candidato accetta quella categoria. (Questa tendenza verso la stringa è appropriata poiché un valore letterale di tipo sconosciuto sembra una stringa.)

Se hai aggiunto un'altra funzione con il tipo di input text al mix sovraccarico, text verrebbe selezionato su varchar .

Personalmente io quasi sempre usa text invece di varchar . Pur essendo compatibile con i binari (quindi quasi ma non proprio uguale), text è più vicino al cuore di Postgres sotto ogni aspetto.

L'ho aggiunto al violino, così come un altro esempio in cui Postgres non riesce a decidere e fa i capricci.

Se vuoi scegliere una funzione particolare, aggiungi un cast di tipo esplicito (questo è il modo di andare qui!):

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