2014-02-27 6 views
1

У меня есть таблица PRODUCTS, которая содержит записи о продуктах или подпрограммах. Субпродукты обозначаются позицией в колонке HIGHERCATALOGID, тогда как для изделий столбец HIGHERCATALOGID имеет значение NULL. Я пытаюсь написать запрос, который выводит имя продукта, если каталог указывает на запись продукта или имя родительского продукта, если каталог указывает на подпродукт. Вот что я пытался сделать:MySQL SELECT statement внутри CASE

SELECT p.catalogid, p.highercatalogid, oi.orderid 
CASE 
    WHEN highercatalogid is null then cname\ 
ELSE 
    SELECT cname from products p1 where p.highercatalogid=p1.catalogid 
END as name 
FROM products p, oitems oi 
WHERE p.catalogid=oi.catalogid 

Однако, это приводит к ошибке.

Код ошибки: 1064. У вас возникла ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «случае, когда highercatalogid является нулевым, тогда CNAME еще выберите CNAME из продуктов р» в строке 2

Что такое правильный способ сделать это?

ответ

2

Вы можете попробовать это так

SELECT p.catalogid, p.highercatalogid, oi.orderid, 
     COALESCE(p2.cname, p.cname) cname 
    FROM oitems oi JOIN products p 
    ON oi.catalogid = p.catalogid LEFT JOIN products p2 
    ON p.highercatalogid = p2.catalogid 

Вот SQLFiddle демо

+0

Спасибо! Я не был знаком с оператором COALESCE, и это именно то, что доктор заказал. – user3358413

+1

@ user3358413 Если это ответит на ваш вопрос, лучше всего, если вы примете ответ, нажав на галочку в верхней левой части ответа - спасибо! –

1
SELECT p.catalogid, p.highercatalogid, oi.orderid 

,

CASE 
WHEN highercatalogid is null then cname 
ELSE 
SELECT cname from products p1 where p.highercatalogid=p1.catalogid 
END as name 
FROM products p, oitems oi 
WHERE p.catalogid=oi.catalogid 
+1

Вы должны добавить какой-то текст, объясняющий, что проблема заключается в отсутствии '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '') – Gorkk

+0

Спасибо. Я модифицировал свой ответ – realnumber3012