2013-08-20 5 views
1

Возможно ли использовать ISNULL дважды для той же колонки?ISNULL дважды для той же колонки

ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2')) 

Или я должен делать это по-другому, если ЕСЛИ ЕСЛИ? Как это будет выглядеть?

+0

@JoachimIsaksson К сожалению, кажется, другая RDBMS – user4035

+0

@ user4035 Похож на 'ISNULL()' SQL SQL, но я предполагаю, что он может существовать в других базах данных тоже. –

+0

@JoachimIsaksson Да, это SQL Server. В MySQL соответствующий оператор называется IFNULL – user4035

ответ

2

Посмотрите на coalesce operator. Тогда ваш запрос будет следующим:

COALESCE(column, 
    (SELECT sum(column2) FROM table WHERE type = '1'), 
    (SELECT sum(column2) FROM table WHERE type = '2')) 

Он возвращает первый ненулевой результат из своих аргументов.

+0

В моем случае я хочу получить ненулевое значение, если значение равно null. С COALESCE он вернет первое значение из своих аргументов. Я неправильно понял COALESCE или может быть написан так, что он будет принимать только первое ненулевое значение из аргументов, если исходное значение равно null? – mediasurface

+0

"может ли оно быть записано так, что оно будет принимать только первое ненулевое значение из аргументов, если исходное значение равно null?" Если исходное значение равно null, оно будет принимать первое ненулевое значение из своих аргументов. Если исходное значение не равно null, оно возвращает исходное значение.Я не уверен, что понимаю ваш вопрос. – Amy

0

Попробуйте использовать COALESCE (если вы используете SQL Server). http://msdn.microsoft.com/en-us/library/ms190349.aspx

Это даст вам первое ненулевое значение из списка значений. Вам нужна дополнительная помощь в структурировании SQL?

+0

В моем случае я хочу получить ненулевое значение, если значение равно null. С COALESCE он вернет первое значение из своих аргументов. Я неправильно понял COALESCE или может быть написан так, что он будет принимать только первое ненулевое значение из аргументов, если исходное значение равно null? – mediasurface

+0

Вы правильно читаете COALESCE. Если вам нужно убедиться, что вы возвращаете только строки, в которых результат будет не нулевым, вы можете обработать это в своем предложении WHERE, проверив (Value1 IS NOT NULL ИЛИ Value2 IS NOT NULL и т. Д.). Это обеспечит, чтобы ваши результаты включали только строки, которые будут выдавать ненулевое значение. Но ... вы также могли бы поместить запрос, который вы написали в другом запросе (сделав его суб-запросом), и указав, что хотите получить только строки, в которых результат COALESCE не равен нулю. Я могу объяснить это больше, если это не имеет смысла. –

1

Да, это возможно.

(вопрос я вижу выражение в вопросе несбалансированные круглые скобки, два дополнительных закрытие Паренса)

ISNULL функция принимает два аргумента. Либо (или оба) этих аргументов могут быть выражениями, а функция ISNULL является выражением. Так что да, вы можете вложить функции ISNULL в два, три, четыре или более уровня, насколько вам нужно.

Оператор SELECT, который возвращает одну строку, содержащую один столбец, может (обычно) использоваться как выражение. И несколько операторов SELECT (подзапросы) в запросе могут ссылаться на одни и те же таблицы (таблицы) и те же столбцы (столбцы).

Во многих случаях, когда мы видим запрос такого типа, он указывает либо на модель, которая не работает, либо указывает на другой способ получения эквивалентного результата.

EDIT

Как и другие ответы указали, тем более портативная, ANSI-совместимые COALESCE функция может быть использована для получения эквивалентного результата.

Эти три выражения эквивалентны:

ISNULL(ISNULL(a,b),c) 
ISNULL(a,ISNULL(b,c)) 
COALESCE(a,b,c) 

, которые также эквивалентны этим (излишне избыточными) выражений:

COALESCE(COALESCE(a,b),c) 
COALESCE(a,(COALESCE(b,c)) 

Контрольный пример:

create table tst (id int, a int, b int, c int); 
insert into tst values 
(1,NULL,NULL,NULL) 
,(2,21,NULL,NULL) 
,(3,NULL,32,NULL) 
,(4,NULL,NULL,43) 
,(5,51,52,NULL) 
,(6,61,NULL,63) 
,(7,NULL,72,73) 
,(8,81,82,83); 

-- SQL Server 
SELECT ISNULL(ISNULL(a,b),c) AS t1 
    , ISNULL(a,ISNULL(b,c)) AS t2 
    , COALESCE(a,b,c)  AS t3 
    FROM tst 
ORDER BY id 

-- MySQL 
SELECT IFNULL(IFNULL(a,b),c) AS t1 
    , IFNULL(a,IFNULL(b,c)) AS t2 
    , COALESCE(a,b,c)  AS t3 
    FROM tst 
ORDER BY id 

-- Oracle 
SELECT NVL(NVL(a,b),c)  AS t1 
    , NVL(a,NVL(b,c))  AS t2 
    , COALESCE(a,b,c)  AS t3 
    FROM tst 
ORDER BY id 
+0

Вы рекомендуете использовать ISNULL таким образом, или вы имеете в виду, что на основе вашего опыта это не так хорошо работает? – mediasurface

+0

@mediasurface: Я думаю, это нормально для вас использовать ISNULL. Выражение в вопросе прекрасно (кроме несогласованных парнеров), если оно возвращает нужный набор результатов. Как указывали другие ответы, вы можете добиться того же результата, используя более портативную ANSI-совместимую функцию «COALESCE». – spencer7593

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