2014-12-03 2 views
0

. Я хочу, чтобы это можно было сделать, верните первое значение, отличное от NULL в списке, или NULL, если нет значения, отличные от NULL. Я использую Oracle SQL для базы данных oracle.Возвращает первое значение, отличное от NULL в списке, или NULL, если нет значений, отличных от NULL.

SELECT 
    a.customer, 
    a.item, 
    b.item, 
FROM 
    Orders a 
     LEFT JOIN 
     item_desc c 
     ON 
    a.item= c.tag1 OR 
    a.item= c.tag2 OR 
    a.item= c.tag3 OR 
    a.item= c.tag4 OR 
    a.item= c.tag5 
     LEFT JOIN 
     Orders b 
     ON 
     c.item = b.item AND 
    a.customer = b.customer 
WHERE 
    a.itemLIKE 'CP%' 
GROUP BY 
    a.customer, 
    a.item, 
    b.item; 

Цель моего запроса, чтобы убедиться, что клиент имеет основной элемент, а не только плетутся купленной, но не может быть плетутся элемент, который принадлежит к нескольким позициям вы увидите ниже, как Джон и Mike есть совпадение для элемента X и значение Null, потому что вы видите элемент 422 является плетутся для элемента X и В. результаты выглядят следующим образом:

Customer Item Item 
Jon   422  X 
Jon   424  NULL 
Mike  424  X 
Mike  422  Null 
Jay   422  Null 
Dan   422  B 
Dan   422  Null 

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

Я хочу, чтобы результаты были такими: Поскольку у Джона и Майка было совпадение, нулевое значение исчезает из набора результатов, но поскольку у Джей не было соответствия, значение Null оставалось.

Customer Item Item 
Jon   422  X 
Mike  424  X 
Jay   422  Null 
Dan   422  B 
+0

таблицы SQL и результирующие наборы являются по своей сути неупорядоченное. Что вы подразумеваете под «первым»? –

+0

Я только хочу вернуть один результат, но я хочу, чтобы иметь возможность возвращать соответствующий элемент, если он есть, и если нет соответствующего элемента, кроме нулевого значения – dc4teg

+0

первое выражение, которое изначально не оценивает значение NULL. – dc4teg

ответ

1

Я подозреваю, что вы можете получить то, что вы хотите использовать агрегацию:

SELECT a.customer, a.item, max(b.item) 
FROM Orders a LEFT JOIN 
    item_desc c 
    ON a.item in (c.tag1, c.tag2, c.tag3, c.tag4, c.tag5) LEFT JOIN 
    Orders b 
    ON c.item = b.item AND 
     a.customer = b.customer 
WHEREa.item LIKE 'CP%' 
GROUP BY a.customer, a.item; 

Это возвращает ненулевое значение, если есть один.

EDIT:

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

SELECT customer, item, bitem 
FROM (SELECT a.customer, a.item, max(b.item) as bitem, 
      row_number() over (partition by a.customer order by (case when a.item is not null then 1 else 2 end)) as seqnum 
     FROM Orders a LEFT JOIN 
      item_desc c 
      ON a.item in (c.tag1, c.tag2, c.tag3, c.tag4, c.tag5) LEFT JOIN 
      Orders b 
      ON c.item = b.item AND 
       a.customer = b.customer 
     WHERE a.item LIKE 'CP%' 
     GROUP BY a.customer, a.item 
    ) t 
WHERE bitem is not null or seqnum = 1; 
+0

это возвращает как нулевое значение, так и соответствующее ненулевое значение, так как тег вдоль 422 может быть с элементами X и B, в этом случае я бы хотел, чтобы он показывал мне соответствующий ненулевой X и только null, если там нет другого матча. подобно тому, что это объясняет, но написано для SQL Oracle. [http://msdn.microsoft.com/en-us/library/ms190349.aspx](http://msdn.microsoft.com/en-us/library/ms190349.aspx) – dc4teg

+0

Можете ли вы взглянуть на мой EDIT выше и расскажите мне, что происходит не так, как я не могу запустить заявление? – dc4teg

+0

@ dc4teg. , , Какую ошибку вы получаете? –

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