2014-02-02 7 views
1

У меня есть приложение ColdFusion 8, которое кэширует большой запрос каждые 2 минуты с помощью запланированной задачи. Этот запрос содержит данные о продуктах. Эти данные используются в вызовах AJAX для автозаполнения логики, что является основной причиной ее кэширования, поскольку каждый раз требуется несколько секунд.Почему я получаю ошибочные записи в Query-of-Queries с условиями LIKE?

В приложении есть несколько страниц, которые запрашивают этот результат запроса с помощью Query-of-Queries.

В этих запросах используется условие LIKE для фильтрации результатов. Однако запрос возвращает записи, которые не соответствуют условиям. Почему это происходит и как я могу это предотвратить?

Мои Cached Запрос:

<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.

Я вижу результаты, как следующее:

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

Я не должен видеть, что второй альбом.

ответ

3

Я думаю, что я понял это, сделав немного больше исследований в Интернете. Мой исходный запрос на самом деле имеет LEFT JOIN в нем, а предложение LIKE в QoQ ColdFusion имеет тенденцию полностью игнорировать значения 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> 
+0

FWIW, а не только QoQ's. 'LIKE' должен всегда игнорировать нулевые значения в любой стандартной базе данных. «Null» считается неизвестным, поэтому он никогда не равен никому, даже другому «null». Любое прямое сравнение «null» ('=', 'like', etcetera) всегда будет возвращать false. – Leigh

 Смежные вопросы

  • Нет связанных вопросов^_^