我有一个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
我不应该看到第二条记录。
答案 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>