2014-07-16 52 views
1

我可以使用cfqueryparam作爲空值來從表中獲取記錄嗎?如何使用cfqueryparam獲取空值以從表中獲取記錄?

我的樣本SELECT查詢是

Select * from users where lastname is null 

丹Bracuk的編輯從這裏開始

下面是針對Oracle數據庫的樣本查詢:

<cfquery name="x" datasource="pamot"> 
select * 
from clinic_fu 
where hsc_number = <cfqueryparam cfsqltype="cf_sql_varchar" value="fred" null="yes"> 
</cfquery> 

下面是從調試網頁。

select * 
from clinic_fu 
where hsc_number = ? 

Query Parameter Value(s) - 
Parameter #1(cf_sql_varchar) = 

您如何理解?是不是這樣的:

where hsc_number is null 

或本

where hsc_number = '' 
+0

你也許能夠做到,但是你擁有的更好。 –

+3

除非您傳遞的值可能爲NULL,否則不需要對該查詢使用cfqueryparam。如果是這樣,看看'cfqueryparam'的'null'屬性。 –

+2

如果null是一個常量(不是變量),那麼在其上使用cfqueryparam沒有任何好處。 – Leigh

回答

1

的方式調試SQL語句將被解釋爲where hsc_number = null這將是所有記錄錯誤。

在某些SQL語言(可能只是MySQL)中,您可以創建空安全表達式。該語句可以在指定null時指定爲null或指定值時指定爲equals語句。我個人不使用Oracle DB,但從我的快速研究中,空安全表達式的唯一選項將包括可能影響性能的函數調用。

當您需要空記錄時,if語句切換到is null應該是最好的方法。

<cfquery name="x" datasource="pamot"> 
    select * 
    from clinic_fu 
    where hsc_number 
    <cfif conditionForNull> 
    is null 
    <cfelse> 
    = <cfqueryparam cfsqltype="cf_sql_varchar" value="#hsc_number#" /> 
    </cfif> 
</cfquery> 

我發現空值屬性對插入和更新語句有用,對select語句更有用。

<cfquery result=> 
    INSERT INTO users 
    (first_name, last_name) 
    VALUES 
    (<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.firstName#" null="#form.firstName eq ""#" />, 
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.lastName#" null="#form.lastName eq ""#" />); 
</cfquery> 

在此聲明中,當名稱值爲空字符串時,空值將傳遞到數據庫而不是表單值。這不是一個非常現實的例子,因爲我會親自編寫空字符串而不是null,但它顯示瞭如何使用null屬性。

+0

解釋有輕微問題。其中hsc_number = null是無效的sql。 –

+0

@DanBracuk - 同意使用ansi標準爲'null',而不是等號。作爲一個有趣的方面說明,行爲實際上取決於dbms。有些像sql server一樣,確實支持非標準的'col = null'語法。 (儘管它很快就會消失)。我發現,困難的方式... – Leigh