Case

帶有 OR AND 的 CASE 表達式

  • December 16, 2020

我有 5 列 - 訂單、運輸、跟踪、傳遞和整體狀態。

我有 4 個狀態,綠色表示“好”,琥珀表示“好”,黃色表示“一般”,紅色表示“壞”。

我希望在所有狀態中的“總體狀態”列中顯示最差狀態。

我想在 CASE 聲明中使用這個

Case
When Order = Green, shipping  = Yellow, tracking = Green, Delivery  = Red then Overallstaus  = Red
When Order = Amber, shipping  = Yellow, tracking = Green, Delivery  = Green then Overallstaus  = Yellow
When Order = Yellow, shipping  = Yellow, tracking = Green, Delivery  = Red then Overallstaus  = Red
When Order = Amber, shipping  = Green, tracking = Green, Delivery  = Green then Overallstaus  = Amber

另一種解決方案是,如果您將列中的狀態名稱儲存在單獨的狀態“列舉”表中,該表以從最佳到最差的遞增順序儲存 ID,那麼您可以根據您使用的數據庫系統執行以下操作( T-SQL):

SELECT 
   (
       SELECT MAX(OverallStatusId)
       FROM 
       (
           VALUES (OrderStatusId),. 
               (ShippingStatusId),. 
               (TrackingStatusId), 
               (DeliveryStatusId)
       ) AS OverallStatus(OverallStatusId)
   ) AS OverallStatusId
FROM OrdersTable

然後,您所要做的就是加入上述OverallStatusId 上的Statuses 列舉表以獲取Status 名稱。

如果 DBMS 是 MySQL,您可以使用

SELECT *,
      FIELD(GREATEST(FIND_IN_SET(order, 'Green,Amber,Yellow,Red'),
                     FIND_IN_SET(shipping, 'Green,Amber,Yellow,Red'),
                     FIND_IN_SET(tracking, 'Green,Amber,Yellow,Red'),
                     FIND_IN_SET(delivery, 'Green,Amber,Yellow,Red')),
            'Green', 'Amber', 'Yellow', 'Red') Overallstatus
FROM source_table

但我強烈建議標準化您的數據。

引用自:https://dba.stackexchange.com/questions/281586