2010-10-14 3 views
14

Как включить вложенный оператор if в предложении select запроса sql? Я знаю, чтобы использовать случай, когда условие then X else y end, но как вы делаете вложенное одно для каждой записи в наборе записей.tsql: возможно ли делать вложенные операторы case в select?

if x.boy is not null then 
    x.boy 
else if x.girl is not null 
    then x.girl 
else if x.dog is not null 
    then x.dog 
else 
    x.cat 

вот моя попытка:

SELECT top 10 
     id, 
     case when x.boy <> NULL then 
      x.boy 
     else case when x.girl <> NULL 
      x.girl 
       else case when x.dog <> NULL 
      x.dog 
       else x.cat 

     end as Who 
from house x 

это правильно?

ответ

16

Вы могли бы упростить это с COALESCE.

SELECT TOP 10 id, COALESCE(x.boy, x.girl, x.dog, x.cat) as Who 
    FROM house x 
16

Да. Нет ничего плохого в случае в случае.

Хотя, вот ваш сценарий, написанный corectly:

SELECT top 10 
    id, 
    case 
     when x.boy IS NOT NULL then x.boy 
     else case 
      when x.girl IS NOT NULL THEN x.girl 
      else case 
       when x.dog IS NOT NULL THEN x.dog 
       else x.cat 
      end 
     end 
    end as Who 
from house x 

ИЛИ

SELECT top 10 
    id, 
    case 
     when x.boy IS NOT NULL then x.boy 
     when x.girl IS NOT NULL THEN x.girl 
     when x.dog IS NOT NULL THEN x.dog 
     else x.cat 
    end as Who 
from house x 

ИЛИ

SELECT top 10 
    id, 
    coalesce(x.boy, x.girl, x.dog, x.cat) AS Who 
from house x 
+0

Я получаю сообщение об ошибке «как» в конце, как Кто .. любые идеи почему? Ошибка – phill

+0

- это неправильный синтаксис рядом с ключевым словом «как». – phill

+0

В моем ответе есть несколько разных способов написать правильное утверждение. Смотрите и добавьте свои комментарии –

0

Попробуйте это:

SELECT top 10 
     id, 
     case when x.boy Is Not NULL then x.boy 
     else 
       case when x.girl Is Not NULL then x.girl 
       else 
        case when x.dog Is Not Null Then x.dog 
        else x.cat End 
       End 

     end as Who 
from house x 

хотя вы могли бы просто использовать coalesce, как предложил Джо.