2013-04-09 27 views
0

我有4個VARCHAR領域,我需要訂購基礎上,如果列是空的表mysql命令由多個COALESCE(CAST

所以我的表結構爲:

start_price  reserve_price  buy_now_price current_bid_amount 
--------------------------------------------------------------------- 
50.00   50.00    empty (not null) (Null) 
190    190    empty (not null) (Null) 
150    150    empty (not null) (Null) 
20    150    empty (not null) (Null) 
550    600    empty (not null) (Null) 

我有下面但爲了子句似乎不正確排序。目前的結果是有序的190,150,50,20,550

ORDER BY COALESCE(CAST(alcurrent_bid_amount AS簽名), CAST(albuy_now_price AS簽名),CAST(alstart_price AS 簽名),CAST(alreserve_price AS簽名))ASC

基本上我需要通過最低優先基於current_bid_amount,buy_now_price,start_price,reserve_price訂購。因此,如果current_bid_amount和buy_now_price爲空,請使用start_price。如果current_bid_amount爲空,但buy_now_price不是,請使用buy_now_price。如果current_bid_amount中有一個值用於定購。

非常感謝。

+0

現在發生了什麼 – zod 2013-04-09 22:44:26

回答

1

將一個空字符串轉換爲一個有符號的是0。因此,您的buy_now_price可能會覆蓋所有內容,因爲它是空的但不爲空。那麼你基本上不會進行排序,因爲你的整合總是會對你的所有物品評價爲0。

mysql> select cast('' as signed); 
+--------------------+ 
| cast('' as signed) | 
+--------------------+ 
|     0 | 
+--------------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> select cast(null as signed); 
+----------------------+ 
| cast(null as signed) | 
+----------------------+ 
|     NULL | 
+----------------------+ 
1 row in set (0.00 sec) 
+0

我曾有過這樣的感覺。如果列是空的,是否有辦法忽略該列?或者我應該更新我的代碼爲空而不是留空? – puks1978 2013-04-09 22:49:49

+0

使用null將使這個更簡單,或者您可以對所有具有非常大的值的值進行合併,並取最小值或負值,並取最大值。但是,所有這些都會出現問題,因爲您將無法使用任何索引。更好的方法是維護一個永不爲空的「訂單列」,並表示要排序的數字,然後您也可以獲取索引。 – 2013-04-09 22:53:36

+0

謝謝。我會用你的建議。 – puks1978 2013-04-09 23:10:01