【问题标题】:Why am I getting erroneous records in a Query-of-Queries with LIKE conditions?为什么我在具有 LIKE 条件的查询中得到错误记录?
【发布时间】:2014-02-02 16:58:45
【问题描述】:

我有一个 ColdFusion 8 应用程序,它使用计划任务每​​ 2 分钟缓存一次大型查询。此查询包含产品数据。此数据用于自动完成逻辑的 AJAX 调用,这是缓存它的主要原因,因为每次运行需要几秒钟。

在应用程序中,有几个页面使用 Query-of-Queries 从此查询结果中进行查询。

在这些查询中,有一个使用 LIKE 条件来过滤结果。但是,查询正在返回不满足条件的记录。为什么会发生这种情况,我该如何预防?

我的缓存查询:

<cfquery name="qProducts" datasource="#APPLICATION.DataSource#">
    SELECT
        P.SKU
        P.DESC,
        P.TITLE,
        P.KEYWORDS,
        X.ATTR1
    FROM    PRODUCTS P
        LEFT JOIN PRODUCTSEXT X
            ON P.SKU = X.EXTSKU
    WHERE   P.ACTIVE = 1
</cfquery>

我的过滤器查询:

<cfquery name="_qFilteredProducts" dbtype="Query">
    SELECT
        SKU
        DESC,
        TITLE,
        KEYWORDS
    FROM    qProducts
    WHERE   1 = 1
        AND (
                DESC LIKE '%#searchstring#%'
            OR  TITLE LIKE '%#searchstring#%'
            OR  KEYWORDS LIKE '%#searchstring#%'
            OR  ATTR1 LIKE '%#searchstring#%'
            )
</cfquery>

所以,假设我为searchstring 传递值“gold”。

我看到如下结果:

SKU               DESC                TITLE         KEYWORDS
-------------------------------------------------------------------------------
ABC               GOLD KEY            GOLD KEY      GOLD KEY SHINY
DEF               SILVER KEY          SILVER KEY    SILVER KEY SHINY

我不应该看到第二条记录。

【问题讨论】:

    标签: tsql coldfusion coldfusion-8 qoq


    【解决方案1】:

    我想我是通过在互联网上进行更多研究来解决这个问题的。我的原始查询实际上有一个 LEFT JOIN,并且 ColdFusion 的 QoQ 中的 LIKE 子句倾向于完全忽略 NULL 值,所以我只需更新我的原始/数据库查询以将所有 NULL 值更改为空字符串。

    <cfquery name="qProducts" datasource="#APPLICATION.DataSource#">
        SELECT
            P.SKU
            P.DESC,
            P.TITLE,
            P.KEYWORDS,
            IFNULL(X.ATTR1, '')
        FROM    PRODUCTS P
            LEFT JOIN PRODUCTSEXT X
                ON P.SKU = X.EXTSKU
        WHERE   P.ACTIVE = 1
    </cfquery>
    

    【讨论】:

    • FWIW,不仅仅是 QoQ。 LIKE 在任何标准数据库中都应始终忽略空值。 null 被认为是未知的,所以它永远不等于任何东西,甚至是另一个 null。对null=like 等)的任何直接比较都将始终返回 false。
    猜你喜欢
    • 2017-01-15
    • 2020-12-30
    • 1970-01-01
    • 2011-07-07
    • 2013-10-03
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多