【问题标题】:Omitting blank/null records from a query? (Coldfusion)从查询中省略空白/空记录? (冷熔)
【发布时间】: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>

towncountry 字段在注册时是必填字段,因此这些字段没有问题,但是我没有将县/州字段设为必填字段,因此如果用户不填写,则值为 NULL进入县或州。如上所述,我可以简单地使用len() 方法只显示包含字符的结果,但这意味着我的查询正在提取它不需要提取的NULL 结果。我已经包含了AND county IS NOT NULL,但这似乎没有任何区别。有人能指出我正确的方向吗?谢谢。

【问题讨论】:

  • 你能展示一个样本结果集吗?字段是否作为 NULL 或空白值输入到数据库中?如果它们为 NULL,则 IS NOT NULL 是正确的语法。
  • 您确定它们为空而不是默认为空白吗?
  • 输入为 NULL,我有它,所以如果在他们注册时该字段留空,则不会输入任何数据,并且还设置了它,以便在更新时,如果该字段仍然存在空白它只是将值更新为 NULL。
  • 如果“而不是县为空”对您不起作用,您可能存储了该值和一个空字符串。您需要检查您的数据是如何添加的,并确保您使用的是 NULL 而不是空白字符串。接下来,您应该检查 cfswitch 而不是执行 cfif/cfelseif.... 最后而不是有 1 个可能会提取 3 或 4 个不同记录集的查询...也许将每个记录集拆分为自己的查询。
  • 这不会对您的问题产生任何影响,但最好使用&lt;cfif structKeyExists(URL, "search")&gt; 而不是&lt;cfif IsDefined("URL.search")&gt;

标签: sql sql-server coldfusion


【解决方案1】:

这最终是一个微不足道的错误,但是值得向确实发现类似问题的任何人指出,如果您根据现有变量添加额外的语句,请检查它们是否在查询的所有级别都不需要。

SELECT DISTINCT county
FROM   artists
WHERE  active = 1
AND    approved = 1
<cfif URL.sort eq "county-az" or URL.sort eq "county-za">
    AND county IS NOT NULL
</cfif>

以上是我需要在查询核心中更改的内容,请注意我已经包含了排除所有 NULL 结果的部分之前检查是否存在搜索词。

【讨论】:

    【解决方案2】:

    尝试在sql server中使用@variables的动态方法:

    declare @county varchar(50), @countylike varchar(50)
    

    如果变量存在于 ColdFusion 中,请在此处添加一些逻辑来设置变量:

    <cfif ....>
    
    </cfif>
    

    然后在 where 子句中添加类似这样的内容:

    and (@county is null or county = @county)
    and (@countylike is null or county like '%'+ @countylike +'%')
    

    【讨论】:

    • 技术上sql server does not guarantee the order of evaluation。所以使用cfif 更安全。
    • 使用我粘贴的代码不依赖于顺序,如果县变量为空,则该部分始终评估为真,对于类似县的变量也是如此。你仍然必须设置这些,我会在冷聚变中这样做,确保只设置一个或另一个。确保使用 来尝试防止注入问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2016-07-03
    相关资源
    最近更新 更多