2013-04-07 69 views
0

我被以下問題填充, 我已經在存儲過程中描述了varibale(DOUBLE),我需要從一個值中指定一個值(item price)表(項目)到這個聲明的變量。然而,我需要從內部使用案例的選擇查詢中獲得此值,項目價格可能在2列基於邏輯我必須找到正確的項目價格。請幫我解決這個問題,當我執行它給了我一個錯誤,Mysql使用Select case將單列值賦值給聲明的值

這裏怎麼是分層的,

DECLARE no_more_users INT DEFAULT 0; 
    DECLARE user_id INT DEFAULT 0; 
    DECLARE cart_id INT DEFAULT 0; 
    DECLARE cart_item_id INT DEFAULT 0; 
    DECLARE user_gift_id INT DEFAULT 0; 
    DECLARE itemPrice DOUBLE DEFAULT 0.0; 
    SELECT 
     CASE 
      WHEN sale_price=0 OR sale_price IS NULL THEN (price - (price * discount)) 
      ELSE sale_price 
     END 
     INTO itemPrice 
    FROM item WHERE item_id = p_item_id ; 

    DECLARE checked_in_users CURSOR FOR 
      SELECT DISTINCT ul.user_id 
      FROM user_location ul 
      LEFT JOIN location_section ls ON ul.location_section_id = ls.location_section_id 
      INNER JOIN user u ON ul.user_id = u.user_id 
      INNER JOIN user_profile up ON u.user_id = up.user_id 
      INNER JOIN location_event le ON ul.location_event_id = le.location_event_id     
      WHERE ul.location_id = p_location_id AND ul.location_event_id = p_event_id 
      AND ul.checked_out_on IS NULL AND (ul.checked_in_on BETWEEN le.start_time AND le.end_time) 
      AND u.status = 1 ; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET no_more_users = 1; 
    OPEN checked_in_users; 
     FETCH checked_in_users INTO user_id; 
     read_loop: LOOP 

更多的代碼...

請注意,SALE_PRICE,價格和折扣是項目表的庫存,邏輯是如果sale_price爲空或值爲0,那麼我應該從價格庫侖中獲得實際銷售價格。最後,我需要的是將之前聲明的varibale的核心項目價格。 任何幫助將高度appriciated。

回答

1

CASE語句有兩個foms,一個是表達式,一個是值。你在混合起來。

與價值觀:

CASE variable 
WHEN value_1 THEN foo 
WHEN value_2 THEN bar 
END 

與表達:

CASE 
WHEN expression_1 THEN foo 
WHEN expression_2 THEN bar 
END 

嘗試

CASE 
WHEN sale_price=0 OR sale_price IS NULL THEN (price - (price * discount)) 
ELSE sale_price 
END 

而且,你不需要 「AS correct_price」 當你使用INTO

+0

謝謝,問題是我已經把這個銷售價格分配給delcared varivale。我沒有跟隨,但它沒有工作。 'SELECT CASE WHEN sale_price = 0 OR sale_price IS NULL THEN(price - (price * discount)) ELSE sale_price END INTO itemPrice FROM item WHERE item_id = p_item_id;'你能否在這方面給我提供正確的語法? – bluelabel 2013-04-07 13:48:21

+0

你是什麼意思「沒有工作」? – Bohemian 2013-04-07 13:54:28

+0

我試圖此,'SELECT CASE WHEN SALE_PRICE = 0 OR SALE_PRICE IS NULL THEN(價格 - (價格*折扣)) ELSE SALE_PRICE END INTO ITEMPRICE FROM項WHERE ITEM_ID = p_item_id; '這個statemnt在下一個語句中拋出一個錯誤,當我註釋掉它時,它會起作用。 – bluelabel 2013-04-07 14:05:21

0

Yo你選擇查詢有一些問題。

您正在使用的CASE版本 - 即CASE var WHEN val1 THEN - 在嘗試匹配NILL時不起作用,因爲在SQL中,null不等於null。

此外,您無法將值與條件相結合。

取而代之,使用簡單條件的CASS版本。還有其他的表面問題。轉換你的破查詢然後給出:

SELECT 
    CASE 
     WHEN ifnull(sale_price, 0) = 0 THEN price - (price * discount) 
     ELSE sale_price 
    END 
INTO itemPrice 
FROM item 
WHERE item_id = p_item_id; 

注意:如果你的表有一個稱爲itemPrice欄目中,您必須從您的變量的另一個名字。 Mysql會感到困惑:/

+0

我已經更新了我的問題getter的想法,這在聲明的CURSOR給出了一個錯誤,但是如果我註釋了分配項目價格聲明itemPrice變量,它工作正常。 – bluelabel 2013-04-07 14:22:13