2011-08-24 37 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

相關問題