为什么我在LIKE条件的Query-of-Queries中得到错误的记录?

时间:2014-02-02 16:58:46

标签: tsql coldfusion coldfusion-8 qoq

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

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

1 个答案:

答案 0 :(得分: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>