2012-07-05 3 views
0

Посмотрите это:Условно использовать ИНЕКЕ в SQL

SELECT clientid,clientname,startdate,enddate,age FROM clients 
WHERE clientid IN (1,2,3,4,5) 
AND CASE WHEN age>10 THEN enddate>'31-05-2013' 
END 

Мой вопрос: Я хочу, чтобы второе условие EndDate> '31 -05-2013' только если возраст> 10

Что не так в этом запросе?

+3

Это обычно хорошая практика, чтобы писать строковые литералы, которые будут преобразованы в даты в недвусмысленных форматах - это поможет предотвратить рабочие скрипты от взлома, если вы когда-либо работать на сервере с различными настройками по умолчанию , '' 20130531'' (например, 'YYYYMMDD' без разделителей) было бы однозначной версией выше. –

+0

@ Downvoter: В чем проблема? – hims056

ответ

3
Select clientid,clientname,startdate,enddate,age from clients 
where clientid in (1,2,3,4,5) 
and (age <= 10 OR enddate > '31-05-2013') 
2

Я не думаю, что вы можете использовать выражение случая, подобное этому. Попробуйте вместо этого:

Select clientid,clientname,startdate,enddate,age from clients 
where clientid in (1,2,3,4,5) 
and (age<=10 or enddate>'31-05-2013') 
1

Есть несколько вещей, которые могли бы быть неправильно. Первый - это то, что даты обычно находятся в заказе 2013-05-31. Это может измениться в зависимости от настроек локали; допустим.

В противном случае, вам нужно написать запрос более просто:

SELECT clientid, clientname, startdate, enddate, age 
    FROM clients 
WHERE clientid IN (1,2,3,4,5) 
    AND ((age > 10 AND enddate > '31-05-2013') OR (age <= 10)) 

Или, используя случай: (. По умолчанию без предложения ELSE является NULL)

SELECT clientid, clientname, startdate, enddate, age 
    FROM clients 
WHERE clientid IN (1,2,3,4,5) 
    AND CASE 
     WHEN age > 10 THEN enddate > '31-05-2013' 
     ELSE TRUE 
     END 

+0

С каких пор SQL имеет тип данных типа boolean, который можно использовать следующим образом? – Lucero

+0

@ Lucero: ваш вопрос о SQL-Server или языке SQL? Или средний SQL-продукт? –

+0

@ypercube, все те, которые вы упомянули. Если я ничего не пропустил, ни SQL Server, ни какой-либо другой SQL-продукт, который я знаю, не допускает этот второй тип запроса (например, используя предикат как выражение и наоборот). – Lucero

0
Select clientid,clientname,startdate,enddate,age from clients 
where clientid in (1,2,3,4,5) 
and ((age>10 and enddate>'31-05-2013') or (age<=10 and enddate<='31-05-2013')) 
Смежные вопросы