2014-07-16 27 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