1

我有一个 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>

所以,假设我将值“gold”传递给searchstring.

我看到如下结果:

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

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

4

1 回答 1

3

我想我是通过在互联网上进行更多研究来解决这个问题的。我的原始查询实际上有一个 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>
于 2014-02-02T17:20:04.580 回答