Да, это возможно.
(Проблема, которую я вижу с выражением в вопросе, - это несбалансированные скобки; две дополнительные закрывающие скобки)
Функция ISNULL
принимает два аргумента. Любой из этих аргументов (или оба) могут быть выражениями, а функция ISNULL
является выражением. Так что да, вы можете вкладывать функции ISNULL на два, три, четыре или более уровней, как вам нужно.
Оператор SELECT, который возвращает одну строку, содержащую один столбец, может (обычно) использоваться как выражение. И несколько операторов SELECT (подзапросов) в запросе могут ссылаться на одну и ту же таблицу (таблицы) и один и тот же столбец (столбцы).
Во многих случаях, когда мы видим запрос такого типа, он указывает либо на плохо работающую модель, либо на поиск другого способа получения эквивалентного результата.
ИЗМЕНИТЬ
Как указывалось в других ответах, более переносимая функция COALESCE
, соответствующая стандарту ANSI, может использоваться для возврата эквивалентного результата.
Эти три выражения эквивалентны:
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
person
spencer7593
schedule
20.08.2013
ISNULL()
SQL Server, но я думаю, что он может существовать и в других базах данных. - person Joachim Isaksson   schedule 21.08.2013