【发布时间】:2013-05-07 12:49:33
【问题描述】:
我目前正在尝试寻找一种方法来忽略该字段为空白的搜索结果。简单的方法是使用<cfif len(example) neq 0>#example#</cfif>,但这意味着我的查询会不必要地提取结果。
<cfquery datasource="#datasource#" name="search">
<cfif URL.for eq "names">
Select artist_id, artist_name
From artists
Where approved = 1
And active = 1
<cfif StructKeyExists("URL.search")>
<cfif URL.find eq "contains">
And name LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
<cfelseif URL.find eq "matches">
And name = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
</cfif>
</cfif>
Order By name Asc
<cfelseif URL.for eq "locations">
<cfif URL.sort eq "town-az" or URL.sort eq "town-za">
Select Distinct town
<cfelseif URL.sort eq "county-az" or URL.sort eq "county-za">
Select Distinct county
<cfelseif URL.sort eq "country-az" or URL.sort eq "country-za">
Select Distinct country
</cfif>
From artists
Where approved = 1
And active = 1
<cfif StructKeyExists("URL.search")>
<cfif URL.find eq "contains">
<cfif URL.sort eq "town-az">
And town LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
Order By town Asc
<cfelseif URL.sort eq "town-za">
And town LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
Order By town Desc
<cfelseif URL.sort eq "county-az">
And county IS NOT NULL
And county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
Order By county Asc
<cfelseif URL.sort eq "county-za">
And county IS NOT NULL
And county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
Order By county Desc
<cfelseif URL.sort eq "country-az">
And country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
Order By country Asc
<cfelseif URL.sort eq "country-za">
And country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%">
Order By country Desc
</cfif>
<cfelseif URL.find eq "matches">
<cfif URL.sort eq "town-az">
And town = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
Order By town Asc
<cfelseif URL.sort eq "town-za">
And town = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
Order By town Desc
<cfelseif URL.sort eq "county-az">
And county IS NOT NULL
And county = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
Order By county Asc
<cfelseif URL.sort eq "county-za">
And county IS NOT NULL
And county = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
Order By county Desc
<cfelseif URL.sort eq "country-az">
And country = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
Order By country Asc
<cfelseif URL.sort eq "country-za">
And country = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#">
Order By country Desc
</cfif>
</cfif>
</cfif>
</cfif>
</cfquery>
town 和 country 字段在注册时是必填字段,因此这些字段没有问题,但是我没有将县/州字段设为必填字段,因此如果用户不填写,则值为 NULL进入县或州。如上所述,我可以简单地使用len() 方法只显示包含字符的结果,但这意味着我的查询正在提取它不需要提取的NULL 结果。我已经包含了AND county IS NOT NULL,但这似乎没有任何区别。有人能指出我正确的方向吗?谢谢。
【问题讨论】:
-
你能展示一个样本结果集吗?字段是否作为 NULL 或空白值输入到数据库中?如果它们为 NULL,则
IS NOT NULL是正确的语法。 -
您确定它们为空而不是默认为空白吗?
-
输入为 NULL,我有它,所以如果在他们注册时该字段留空,则不会输入任何数据,并且还设置了它,以便在更新时,如果该字段仍然存在空白它只是将值更新为 NULL。
-
如果“而不是县为空”对您不起作用,您可能存储了该值和一个空字符串。您需要检查您的数据是如何添加的,并确保您使用的是 NULL 而不是空白字符串。接下来,您应该检查 cfswitch 而不是执行 cfif/cfelseif.... 最后而不是有 1 个可能会提取 3 或 4 个不同记录集的查询...也许将每个记录集拆分为自己的查询。
-
这不会对您的问题产生任何影响,但最好使用
<cfif structKeyExists(URL, "search")>而不是<cfif IsDefined("URL.search")>
标签: sql sql-server coldfusion