2016-10-07 3 views
-1

У меня есть запрос, который я, имеющий небольшие проблемы с получением работы, как я хочу, запрос выглядит следующим образом:Если статья с IF условие

SELECT 
    hf.file_path AS image, 
    hop.order_product_name AS product, 
    hop.order_product_price AS unit_flat_price, 
    .... <SHORTENED DOWN QUERY> .... 
    hc.currency_symbol AS currency, 
    ho.order_payment_method AS payment_method, 
    ho.order_created AS created 
FROM 
    shop_order AS ho 
LEFT JOIN 
    shop_order_product AS hop ON ho.order_id = hop.order_id 
LEFT JOIN 
    shop_product AS hp ON hop.product_id = hp.product_id 
LEFT JOIN 
    shop_file AS hf ON(
    IF(
     hp.product_parent_id > 0, 
     hp.product_parent_id, 
     hp.product_id 
    ) 
) = hf.file_ref_id 
LEFT JOIN 
    shop_currency AS hc ON ho.order_currency_id = hc.currency_id 
WHERE 
    ho.order_id = X AND(
    hf.file_ordering = 0 OR hf.file_ordering = NULL 
) 

Теперь мой вопрос заключается в том, что иногда таблица shop_file выиграл «т есть матч в shop_file таблицы, а затем мне нужен мой запрос, чтобы„игнорировать“, что присоединиться, но если есть совпадение, то мне нужно применить AND части в предложении WHERE я попытался

WHERE 
    ho.order_id = X (
    IF(
     hf.file_path = NULL, 
     '', 
     AND(
     hf.file_ordering = 0 OR hf.file_ordering = NULL 
    ) 
    ) 
) 

Я пробовал с различными значениями на hf.file_path = линии, но ничего не помогало, я все еще получил ошибку синтаксиса #1064 - You have an error in your .... syntax to use near '(IF(

Я также попытался

WHERE 
    ho.order_id = X AND(
    hf.file_id = NULL OR(
     hf.file_ordering = 0 OR hf.file_ordering = NULL 
    ) 
) 

Но это просто возвращает пустой результирующий набор (где, если я удалить всю AND(...) части я получаю нужный мне результат.

Теперь я знаю, что могу сделать что-то вдоль линий

WHERE 
    ho.order_id = X AND(
    IF EXIST(SELECT file_path FROM ...) 

Но это потребовало бы мне добавить другой JOINS в этом запросе, чтобы получить правильный результат (в случае, если есть изображение) и я хотите попытаться избежать необходимости добавлять JOIN в WHERE ... AND(IF_EXIST (SELECT, если это возможно.

ответ

1

вам необходимо добавить CASE в оператор where.

Попробуйте это, добавив в ваш ИНЕКЕ:

AND CASE 
WHEN hf.file_path IS NOT NULL 
THEN hf.file_ordering = 0 OR hf.file_ordering IS NULL END; 
+0

Боится, что также возвращает пустой результирующий набор. – Epodax

+0

вы боитесь, или вы, где это проверить? Если файл не имеет значения null, то дополнительное условие будет добавлено в оператор where. Это то, что вы хотите, чтобы не понимать, чего вы боитесь? Это приведет к возврату пустого набора из таблицы hf, когда условия не совпадут - его просто. Я отредактировал последний комментарий, должен быть IS NULL not = NULL – michal

+0

Я выполнил запрос с кодом в вашем ответе, и он вернул пустой набор результатов, «боится» - это способ речи, это вежливый способ говоря: «Это не работает». - Как это http://ell.stackexchange.com/questions/1195/when-can-you-use-im-afraid-that – Epodax

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