在NULL的情况下获取其他字段值

时间:2012-09-20 09:09:27

标签: mysql sql

CREATE TABLE itemmast (
  cid INTEGER,
  description varchar(30),
  defaultprice DOUBLE);

INSERT INTO itemmast VALUES (1, 'Item 1', '0');
INSERT INTO itemmast VALUES (2, 'Item 2', '8');
INSERT INTO itemmast VALUES (3, 'Item 3', '5.5');
INSERT INTO itemmast VALUES (4, 'Item 4', '0');
INSERT INTO itemmast VALUES (5, 'Item 5', '59');


CREATE TABLE specialprice (
  cid INTEGER,
  username varchar(30),
  newprice DOUBLE);

INSERT INTO specialprice VALUES (4, 'UserS', '10');
INSERT INTO specialprice VALUES (2, 'UserX', '115');

我希望为特定用户获取[newprice]的值,以防万一在[specialprice]表中,否则从[itemmast]表中获取[defaultprice]

到目前为止,我有这个但没有按预期工作。

SELECT itemmast.*,newprice,
CASE specialprice.newprice
    WHEN NULL
      THEN itemmast.defaultprice
ELSE
  specialprice.newprice
END AS itemprice
FROM itemmast
LEFT JOIN specialprice ON specialprice.cid = itemmast.cid
where itemmast.cid = '1' and username= 'UserS'

4 个答案:

答案 0 :(得分:2)

将您的CASE声明更改为

CASE WHEN specialprice.cid IS NULL
     THEN itemmast.defaultprice
     ELSE specialprice.newprice
END as RealPrice

SQLFiddle Demo

或者使用COALESCE

COALESCE(specialprice.newprice, itemmast.defaultprice)

SQLFiddle Demo

答案 1 :(得分:0)

为什么不选择我们IFNULL

  

•IFNULL(表达式1,表达式2)

     

如果expr1不为NULL,则IFNULL()返回expr1;否则它会返回   表达式2。 IFNULL()返回一个数字或字符串值,具体取决于   使用它的上下文。

mysql> SELECT IFNULL(1,0);
        -> 1
mysql> SELECT IFNULL(NULL,10);
        -> 10
mysql> SELECT IFNULL(1/0,10);
        -> 10
mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'

所以在你的例子中,像是

SELECT  itemmast.*,
        newprice,  
        IFNULL(specialprice.newprice, itemmast.defaultprice) itemprice
FROM    itemmast  LEFT JOIN 
        specialprice ON specialprice.cid = itemmast.cid  

答案 2 :(得分:0)

对于更通用的方法,请使用IF(,,):

IF (specialprice.newprice IS NULL, specialprice.defaultprice, specialprice.newprice)

参考:http://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html#function_if

答案 3 :(得分:0)

其他答案都没问题,但原因你的SQL不起作用的是null永远不会等于任何东西,甚至不是null,你的案例陈述是比较specialprice.newpricenull的值,永远不会为真。

唯一对null为true的测试是特殊的is null测试,所以你必须使用它:

case when specialprice.newprice is null ... else ... end

或使用内置功能:

select ifnull(specialprice.newprice, itemmast.defaultprice) ...