Oracle sql 11g. Может ли функция nvl2 включать оператор выбора?

Даже не уверен, что nvl2 это то, что мне следует использовать, но мне кажется, что это имеет смысл. Если бы я мог заставить select работать. Приведенные ниже данные не являются реальными, но насколько я могу приблизиться к воображаемым объектам:

Я пытался опубликовать это с полным случаем двух таблиц и одного представления, но я продолжал получать «произошла ошибка при публикации», поэтому я подумал, что попробую без каких-либо тестовых данных.... Есть две таблицы - t1 и t2 -- которые содержат столбцы «имя», «стиль», «цвет» и «двери».

.. у каждого из них есть несколько строк данных, где все равны, и несколько строк, которые не совпадают. Если «имя» и «двери» равны, мне нужно, чтобы цвет в представлении был таким же, как в t1. Если «имя» и «двери» не совпадают, мне нужно, чтобы цвет в представлении читался как «оранжевый».

Я попытался создать в операторе выбора представления функцию nvl2 с оператором выбора, определяющим первое значение.

nvl2(color, (select color from t1 where t1.style = t2.style and t1.doors = t2.doors), orange)

Может ли функция nvl2 содержать выбор? Я сделал это неправильно, и если да, то что я должен использовать вместо функции nvl2?


person user761758    schedule 20.03.2016    source источник
comment
Поиск в Google nvsl или nvsl2 ничего значимого не дает. Возможно, вы имеете в виду nvl2?   -  person Mureinik    schedule 20.03.2016
comment
конечно... так отредактировано, спасибо!!   -  person user761758    schedule 20.03.2016
comment
Каков ваш ожидаемый результат? Некоторые примеры данных были бы хороши.   -  person Kamil Gosciminski    schedule 20.03.2016
comment
Это немного расплывчато, но не будет ли здесь работать левое соединение и оператор case, чтобы выбрать, какой цвет использовать?   -  person Alex Poole    schedule 20.03.2016
comment
У меня есть корпус, но я не смог включить его в исходный вопрос...   -  person user761758    schedule 20.03.2016
comment
ожидаемый результат - создать представление, показывающее все строки, которые соответствуют имени, стилю и дверям, а также цвету, указанному в t1, и строки, которые совпадают по имени, но не по стилю ИЛИ дверям, чтобы быть альтернативным цветом... оранжевым...   -  person user761758    schedule 20.03.2016


Ответы (2)


Это немного расплывчато, чего вы пытаетесь достичь, но это может сработать:

SELECT
  t1.*,
  CASE WHEN t2.name is not null THEN t1.color ELSE 'orange' END as color
FROM
  t1
  LEFT JOIN t2 ON
    t1.name = t2.name
    AND t1.doors = t2.doors

Возможно, вам придется изменить порядок t1 и t2 в отношении соединений, потому что неясно, из какой таблицы вы хотите извлечь свой набор строк.

Вам нужны только операторы LEFT JOIN и CASE для реализации вашей логики выбора цвета.

Редактировать после комментария:

Я действительно думаю, что вы ищете эту логику, но мне все еще не ясно:

SELECT
  t1.*,
  CASE WHEN t1.doors = t2.doors and t1.style = t2.style and t1.color = t2.color THEN t1.color ELSE 'orange' END as color
FROM
  t1
  LEFT JOIN t2 ON
    t1.name = t2.name
person Kamil Gosciminski    schedule 20.03.2016
comment
Точно... левое соединение с кейсом сделало это... и кажется наименее запутанным способом сделать это в будущем... когда другие должны видеть то же самое...... - person user761758; 20.03.2016

Я думаю, вы подходите к этому неправильно. Предполагая, что t1 и t2 имеют отношение 0:[0..1] (которое, я думаю, у них должно быть, иначе вопрос не имеет особого смысла), вашим предпочтительным оружием будет left join и применение nvl или что-то в этом роде. в связи с этим (см. ниже) после присоединения:

SELECT    t2.*, NVL(t1.color, 'orange')
FROM      t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors

Обратите внимание, что nvl — это функция Oracle. Эквивалентом ANSI-SQL будет coalesce, и его использование сделает ваше приложение более переносимым:

SELECT    t2.*, COALESCE(t1.color, 'orange')
FROM      t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors
person Mureinik    schedule 20.03.2016
comment
спасибо... а привлекать его к созданию представления? - person user761758; 20.03.2016
comment
@user761758 user761758 Просто вставьте этот выбор в оператор create view: CREATE VIEW myview AS SELECT -- etc.... - person Mureinik; 21.03.2016