2015-07-10 53 views
0

所以我有查詢,像這樣:忽略插入如果值爲null

INSERT INTO price_hist 
      ( 
         date, 
         product_id, 
         price_min, 
         price_max, 
         price_avg, 
         merchants 
      ) 
      VALUES 
      ( 
         '2015-07-10', 
         100388, 
         ( 
           SELECT min(price) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1), 
         ( 
           SELECT max(price) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1), 
         ( 
           SELECT avg(price) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1), 
         ( 
           SELECT count(price) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1) 
      ) 

price_maxprice_minprice_avg不能爲空,但並不是所有產品都漲價了,所以很自然的子查詢這些產品返回NULL。如果我使用INSERT IGNORE,查詢確實執行,但不是跳過插入,而是將0值插入所有這些字段。任何方式,我可以修改它,所以它會一起跳過插入,如果任何字段爲空?

product_history表已經有設置的字段,所以它們不能爲NULL。

+0

你試過IFNULL()盈? – Markus

回答

2

只需使用一個INSERT ... SELECT,而不是:你的子查詢的查詢

INSERT INTO price_hist 
( 
    date, 
    product_id, 
    price_min, 
    price_max, 
    price_avg, 
    merchants 
) 
SELECT 
    '2015-07-10', 
    100388, 
    min(price), 
    max(price), 
    avg(price), 
    count(price) 
FROM prices 
WHERE product_id = 100388 
AND active = 1 
HAVING count(price) 
+0

美麗!正是我在找什麼!謝謝! – galdikas

0

使用IFNULL()

試試這個

INSERT INTO price_hist 
     ( 
        date, 
        product_id, 
        price_min, 
        price_max, 
        price_avg, 
        merchants 
     ) 
     VALUES 
     ( 
        '2015-07-10', 
        100388, 
        ( 
          IFNULL(SELECT min(price) 
          FROM prices 
          WHERE product_id = 100388 
          AND active = 1), 0), 
        ( 
          IFNULL(SELECT max(price) 
          FROM prices 
          WHERE product_id = 100388 
          AND active = 1), 0), 
        ( 
          IFNULL(SELECT avg(price) 
          FROM prices 
          WHERE product_id = 100388 
          AND active = 1), 0), 
        ( 
          IFNULL(SELECT count(price) 
          FROM prices 
          WHERE product_id = 100388 
          AND active = 1), 0) 
     ) 
+0

如果我理解正確,這將返回0?然後將繼續並將其插入歷史表中? – galdikas

+0

是因爲你說product_history表已經有設置的字段,所以它們不能是'NULL' –

0
INSERT INTO price_hist 
      ( 
         date, 
         product_id, 
         price_min, 
         price_max, 
         price_avg, 
         merchants 
      ) 
      VALUES 
      ( 
         '2015-07-10', 
         100388, 
         ( 
           SELECT ifnull(min(price),0) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1), 
         ( 
           SELECT max(price) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1), 
         ( 
           SELECT ifnull(avg(price),0) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1), 
         ( 
           SELECT count(price) 
           FROM prices 
           WHERE product_id = 100388 
           AND active = 1) 
      ) 
+0

這將插入0,價格歷史,我想跳過插入,如果任何值爲NULL – galdikas