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'
答案 0 :(得分:2)
将您的CASE
声明更改为
CASE WHEN specialprice.cid IS NULL
THEN itemmast.defaultprice
ELSE specialprice.newprice
END as RealPrice
或者使用COALESCE
COALESCE(specialprice.newprice, itemmast.defaultprice)
答案 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.newprice
与null
的值,永远不会为真。
唯一对null为true的测试是特殊的is null
测试,所以你必须使用它:
case when specialprice.newprice is null ... else ... end
或使用内置功能:
select ifnull(specialprice.newprice, itemmast.defaultprice) ...