2013-12-24 4 views
0

Я хочу выполнить следующий запрос, как его реализовать?Оператор SQL if в выражении WHERE

SELECT * FROM table WHERE routeNum LIKE 'N10%' 
-->if no rows return, WHERE clause change to routeName LIKE '&something%' 
+0

вы хотите использовать сазе, проверить этот форум или Google для заявления SQL Дело в том, где п –

+0

@user .. можете ли вы продлить свое требование? –

+1

@ пользователь .. вы используете mysql или sqlserver? –

ответ

2

Я думаю, что это будет работать для вас:

WITH CTE AS (
    SELECT 2 AS 'INDEX', * FROM table WHERE routeNum LIKE 'N10%' 
    UNION ALL 
    SELECT 1 AS 'INDEX', * FROM table WHERE routeNum LIKE '&something%' 
) 
SELECT * 
FROM CTE 
WHERE CTE.INDEX = (SELECT MAX(INDEX) FROM CTE) 

Как вы должны выбрать между двумя наборами результатов, то вам нужно два запроса, который будет возвращать два различных набора, а затем, на основе 'index', который соответствует запущенному запросу, вы выбираете, как отображать результаты.

Демо-версия: SQLFiddle.

+0

ЭТО РАБОТАЕТ, СПАСИБО! – user2761885

0
WITH tmp AS 
(
SELECT t.*, 
CASE 
    WHEN routeNum LIKE 'N10%' THEN 1 
    WHEN routeNum LIKE '&something%' THEN 2 
    ELSE 3 END AS q 
FROM table t 
) 

SELECT * FROM tmp t 
WHERE q = CASE WHEN (SELECT COUNT(*) FROM tmp WHERE q = 1) > 0 THEN 1 ELSE 2 END 
1

Возможное решение

WITH cte AS 
(
    SELECT * 
    FROM routes 
    WHERE routeNum LIKE 'N10%' 
) 
SELECT * FROM cte 
UNION ALL 
SELECT * FROM routes 
WHERE routeNum LIKE 'something else%' 
    AND NOT EXISTS 
(
    SELECT * 
    FROM cte 
) 

Вот SQLFiddle демо

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