2011-08-24 40 views
7

这种说法不符合的PostgreSQL 8.2.4和5.2.17 PHP工作:

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

很公平。这是一个可能的修复:

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

这是有道理的,因为我们正在明确数据类型。

但下面的语句也适用,尽管它应该是等同于第一个表达式:

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

为什么? COALESCE以某种方式修改$ 1的数据类型,或者保证一些简单的数据类型作为结果?

编辑The docs关于COALESCE的主题相当短。

+0

Assumably ,是的。我会[检查该功能的文档](http://www.postgresql.org/docs/9.0/interactive/functions-conditional.html#AEN15541)。它应该指定返回值 - 但不要问我的解释:) – hakre

回答

2

​​3210总是返回第一个非空字符串,
所有null的事件(在你的情况,是$1不确定的变量)提供,
它导致NULL

NULL不为未定义

原谅我的不好解释真正的同...

第一个例子,你试图返回一个不确定的变量,它会导致错误。

然而,在第三个例子,你试图返回(由COALESCE返回)一个NULL值,
没有更多的不确定的变量,只是一个NULL返回,这使选择做工精细

+0

你有最后一个陈述的参考? [NULL值](https://secure.wikimedia.org/wikipedia/en/wiki/Null_%28SQL%29)“表示数据库中不存在数据值”和“COALESCE”为(根据相同的页面)“定义为”等效CASE“语句的简写形式,但是'SELECT CASE当$ 1不为NULL,然后$ 1 END'也失败。 – l0b0

+0

'由于Null不是任何数据域的成员,它不被视为“价值”,而是从您提供的文档中指示缺少价值的标记(或占位符) – ajreal

+0

这是如何解释'NULL'和'undefined'?它看起来完全相反:“不是一个值”===未定义。至少这是[Perl](http://www.postgresql.org/docs/8.4/interactive/plperl-funcs.html)使用的解释:SQL'NULL'→Perl'undef'。 – l0b0

相关问题