2012-06-19 54 views
0

我正在尝试使用MySQL CASE语句从产品表中选择产品。如何让MySQL case语句在存储过程中工作?

我有这样的:

SELECT art.a,art.b,art.c 
FROM products AS art 
    WHERE art.inventory != "0" 
    # filter by param_reference_iln (seller ID = vARCHAR(13)) 
    CASE   
    WHEN param_reference_iln = '3333333333333' THEN AND art.iln = '1111111111111' OR art.iln = '2222222222222' 
    WHEN param_reference_iln = '8888888888888' THEN AND art.iln = '7777777777777' 
    ELSE AND art.iln NOT IN ('1111111111111','2222222222222','7777777777777') 
    END CASE; 

我曾经尝试都CASE variants,但我不能让任何工作。

问题
我在做什么错?

+3

修复您的查询,几个语法错误。在'CASE'前面缺少'AND','THEN AND'也是不可能的,也许更多... – fancyPants

+0

如果param_reference_iln的值是3333333333333或8888888888888,你想要做什么?你想从你的查询返回什么? – neeraj

+1

*无法上手*不是有效的MySQL错误消息。 –

回答

1

我不确定您可以在WHERE子句中拥有CASE。 无论如何,你应该使用一个严格的布尔syntaxe这里:

SELECT art.a,art.b,art.c 
FROM products AS art 
WHERE art.inventory != "0" 
    AND (
     (param_reference_iln = '3333333333333' AND (art.iln = '1111111111111' OR art.iln = '2222222222222')) 
     OR 
     (param_reference_iln = '8888888888888' AND art.iln = '7777777777777') 
     OR 
     art.iln NOT IN ('1111111111111','2222222222222','7777777777777') 
    ); 
+0

谢谢!那么多......我正在拼命寻找如何让这个工作。 – frequent

0

这不是用于选择,而是用于存储过程。向下滚动您发布的页面,您将看到

+0

对不起,我正在尝试这storedproc里面。编辑问题。谢谢! – frequent

1

您不能使用CASE通过让它返回的条件语句,如THEN AND ...和期待AND动态地构造一个where子句适用于前述条件

您需要使用vanilla内联逻辑;

WHERE art.inventory != "0" 
AND (
    (param_reference_iln = '3333333333333' AND art.iln IN ('1111111111111', '2222222222222')) 
    OR 
    (param_reference_iln = '8888888888888' AND art.iln = '7777777777777') 
    OR 
    (art.iln NOT IN ('1111111111111','2222222222222','7777777777777')) 
) 
+0

好的。理解。感谢您的解释。 – frequent