1
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

4 回答 4

2

CASE将您的陈述更改为

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

SQLFiddle 演示

或者使用COALESCE

COALESCE(specialprice.newprice, itemmast.defaultprice)

SQLFiddle 演示

于 2012-09-20T09:14:18.547 回答
0

为什么不宁愿我们IFNULL

•IFNULL(expr1,expr2)

如果 expr1 不为 NULL,则 IFNULL() 返回 expr1;否则返回 expr2。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  
于 2012-09-20T09:13:52.623 回答
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

于 2012-09-20T09:18:50.267 回答
0

其他答案都可以,但是您的 SQL 不起作用的原因null是它永远不等于任何东西,甚至不等于null,并且您的 case 语句正在比较的值specialprice.newpricenullwhich永远不会为真。

唯一适用于 null 的测试是特殊is null测试,因此您必须使用它:

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

或使用内置功能:

select ifnull(specialprice.newprice, itemmast.defaultprice) ...
于 2012-09-20T09:27:33.777 回答