数据类型$ 1 vs. coalesce($ 1)

l0b*_*0b0 7 php postgresql query-parameters

此语句不适用于PostgreSQL 8.2.4和PHP 5.2.17:

 pg_query_params('SELECT $1', array(1));
 ERROR: could not determine data type of parameter $1 
Run Code Online (Sandbox Code Playgroud)

很公平.这是一个可能的解决方案:

 pg_query_params('SELECT CAST($1 AS INTEGER)', array(1));
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我们明确了解数据类型.

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

 pg_query_params('SELECT COALESCE($1)', array(1));
Run Code Online (Sandbox Code Playgroud)

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

编辑:文档在主题上相当短COALESCE.

ajr*_*eal 2

coalesce始终返回第一个非空字符串,
如果提供了所有null(在您的情况下,是未定义的变量$1),
它会导致NULL.

NULL与未定义并不真正相同

请原谅我不好的解释...

第一个示例,您试图返回一个未定义的变量,这会导致错误。

但是,在第三个示例中,您尝试返回 NULL 值(由合并返回),
不再有未定义的变量,只是返回 NULL,这使得select 工作正常