2011-08-24 43 views
7

Esta declaración no funciona con PostgreSQL 8.2.4 y PHP 5.2.17:

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

Justo lo suficiente. Esta es una solución posible:

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

Eso tiene sentido ya que estamos siendo explícitos sobre el tipo de datos.

Pero la siguiente declaración también trabaja, aunque debería ser equivalente a la primera expresión:

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

¿Por qué? ¿De alguna manera, el COALESCE modifica el tipo de datos de $ 1 o garantiza algún tipo de datos simples como resultado?

Editar: The docs son más bien breves sobre el tema COALESCE.

+0

assumably Sí, Yo [verificaría los documentos de esa función] (http://www.postgresql.org/docs/9.0/interactive/functions-conditional.html#AEN15541). Debe especificar el valor de retorno, pero no me pida una explicación :) – hakre

Respuesta

2

coalesce siempre devuelven la primera cadena no nula,
en el caso de todos los null (en su caso, es variable no definida de $1) suministrado,
que conducen a NULL.

NULL no es verdaderamente mismo que sin definir

perdón mi mala explicación ...

El primer ejemplo, que están tratando de devolver una variable no definida que conducen a un error.

Sin embargo, en el tercer ejemplo, usted está tratando de devolver un valor NULL (devuelto por coalescencia),
no es variable no más indefinido, a NULL devuelto, esto hace seleccione trabajo fino

+0

¿Tiene una referencia para la última declaración? Un [valor NULO] (https://secure.wikimedia.org/wikipedia/en/wiki/Null_%28SQL%29) "indica [s] que un valor de datos no existe en la base de datos" y 'COALESCE' es (de acuerdo con la misma página) "definido como la abreviatura de" la declaración 'CASE' equivalente, pero 'SELECCIONE CASO CUANDO $ 1 NO ES NULO ENTONCES $ 1 END' también falla. – l0b0

+0

'Dado que Null no es miembro de ningún dominio de datos, no se considera un" valor ", sino un marcador (o marcador de posición) que indica la ausencia de valor' del documento que ha suministrado – ajreal

+0

¿Cómo se explica la diferencia entre 'NULL' y' undefined'? Parece hacer exactamente lo contrario: "no es un valor" === indefinido. Al menos esta es la interpretación utilizada por [Perl] (http://www.postgresql.org/docs/8.4/interactive/plperl-funcs.html): SQL 'NULL' → Perl' undef'. – l0b0

Cuestiones relacionadas