2011-08-24 12 views
7

Questa affermazione non funziona con PostgreSQL 8.2.4 e PHP 5.2.17:

pg_query_params('SELECT $1', array(1)); 
ERROR: could not determine data type of parameter $1 

Mi sembra giusto. Questa è una possibile soluzione:

pg_query_params('SELECT CAST($1 AS INTEGER)', array(1)); 

Questo ha senso poiché siamo espliciti sul tipo di dati.

Ma la seguente dichiarazione funziona anche, anche se dovrebbe essere equivalente alla prima espressione:

pg_query_params('SELECT COALESCE($1)', array(1)); 

Perché? COALESCE in qualche modo modifica il tipo di dati di $ 1 o garantisce un semplice tipo di dati come risultato?

Modifica: The docs sono piuttosto brevi in ​​tema di.

+0

assumably , sì. Vorrei [controllare i documenti di quella funzione] (http://www.postgresql.org/docs/9.0/interactive/functions-conditional.html#AEN15541). Dovrebbe specificare il valore di ritorno, ma non chiedermi una spiegazione :) – hakre

risposta

2

coalesce ritornano sempre la prima stringa non nulla,
nel caso di tutti null (nel caso, è variabile indefinita di $1) fornito,
si portano a NULL.

NULL non è veramente uguale undefined

perdono il mio male spiegazione ...

Il primo esempio, si stanno cercando di restituire una variabile non definita, che portano a un errore.

Tuttavia, nel terzo esempio, si sta cercando di restituire un valore NULL (restituito da fondono),
non v'è variabile più indefinita, solo un NULL restituito, questo rende selezionare funzionano bene

+0

Hai un riferimento per l'ultima affermazione? Un [valore NULL] (https://secure.wikimedia.org/wikipedia/en/wiki/Null_%28SQL%29) "indica [s] che un valore di dati non esiste nel database" e 'COALESCE' è (secondo la stessa pagina) "definito come abbreviazione per" l'equivalente istruzione 'CASE', ma' SELECT CASE WHEN $ 1 NON È NULL THEN $ 1 END' fallisce anche. – l0b0

+0

'Poiché Null non è un membro di alcun dominio dati, non è considerato un" valore ", ma piuttosto un marcatore (o segnaposto) che indica l'assenza di valore' dal documento che hai fornito – ajreal

+0

Come spiega la differenza tra 'NULL' e' indefinito'? Sembra fare l'esatto opposto: "non un valore" === non definito. Almeno questa è l'interpretazione usata da [Perl] (http://www.postgresql.org/docs/8.4/interactive/plperl-funcs.html): SQL 'NULL' → Perl' undef'. – l0b0