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');

[specialprice] テーブルにある場合に備えて特定のユーザーの [newprice] の値を取得したい、そうでない場合は [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

他の答えは大丈夫ですが、SQLが機能しない理由nullは、それが何にも等しくないことnullあり、caseステートメントはその値を比較しているためspecialprice.newpriceです。null

nullに当てはまる唯一のテストは特別なis nullテストであるため、次のテストを使用する必要があります。

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

または、組み込みの機能を使用します。

select ifnull(specialprice.newprice, itemmast.defaultprice) ...
于 2012-09-20T09:27:33.777 に答える
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 に答える