2014-02-27 64 views
1

我有一个PRODUCTS表,其中包含产品记录或子产品记录。子产品通过在HIGHERCATALOGID列中具有条目来指示,而对于产品HIGHERCATALOGID列为NULL。我试图编写一个查询,如果catalogid指向产品记录,则输出产品名称,如果catalogid指向子产品,则输出父产品的名称。这是我试图做的:CASE中的MySQL SELECT语句

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是空的商品P然后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

您应该添加一些文字解释说这个问题是'oi.orderid'后面缺少的','会更清晰。 – Gorkk

+0

谢谢。我修改了我的答案 – realnumber3012