Mysql

python的truthy / falsy / bool概念是否有等效的sql檢查?

  • March 14, 2022

我正在嘗試查找連接到 python的**mysql數據庫中特定列的用法。**Python 將以下內容視為“虛假”:

  • 空列表:$$ $$
  • 空元組:()
  • 空字典:{}
  • 空字元串“”
  • 整數:0
  • 浮點數:0.0
  • 沒有任何
  • 錯誤的

我意識到這有點依賴於 ORM(例如,空數據類型儲存為 NULL 而不是字元串)但下面有點等價,有沒有更好的方法,有什麼明顯的我遺漏了嗎?也許0.0?這個想法是計算 row_count 並減去這個結果。我嘗試NOT IN了真實,但似乎沒有得到一致的結果。

SELECT COUNT(*) FROM `tabBatch` WHERE naming_series IN ('', 0, NULL);

最後,我發現這滿足了我的需要,因為我需要在查詢中多次使用它,並且它必須處理各種欄位類型(您不能從 CHAR 向下轉換為 INT,似乎只能向上轉換)。

COALESCE 適用於沒有行的表,在這種情況下 SUM 返回 NULL。事實證明這很有用,因為在另一個應用程序中,我想區分零行(SUM = NULL)和全部為空的行(SUM = 0)。

sql_truthy = """
 COALESCE(SUM(
   CASE WHEN `{field}` IS NULL THEN 0
        WHEN CAST(`{field}` AS CHAR) IN ('0', '0.0', '') THEN 0
        ELSE 1
   END
 ), 0) AS used"""

將其用作列欄位而不是 WHERE 子句的優點是它可以在同一查詢中多次用於多個欄位。WHERE 子句需要對每個欄位進行查詢。

獎勵:我用 aCOUNT(*) as total來查找同一查詢中的總行數。

  • MySQL 返回 3 種類型的“真/假”:0(假)、1(真)、NULL。
  • 在涉及的大多數情況下NULL,結果將是NULL.
  • NULL只能使用這些進行測試: IS NULL, IS NOT NULL, <=>. (好吧,我可能忘記了一些事情。)另見,COALESCE()
  • 聲明列時NOT NULL,不能儲存NULL; 嘗試這樣做可能會儲存 0 / 0.0 / ‘’。
  • 盡量避免低效WHERE x IS NULL OR x = 0;為您的“例外”案例選擇一個或另一個。
  • 有許多可能的用途NULL;讓我們討論您的特定業務邏輯。這種一般性的討論可能還不夠。
  • 如果子查詢可能不返回任何行,請考慮是否EXISTS(SELECT 1 FROM .. WHERE ...)會更快。它總是返回 0 或 1。
  • NULL某些聚合忽略值(請參閱 參考資料GROUP BY)。

執行這些以查看一些範例:

SELECT NULL IN (1, 2);  --> NULL
SELECT 1 IN (1, NULL);  --> 1
SELECT 1 IN (2, NULL);  --> NULL
SELECT NULL IN (1, NULL); --> NULL

這樣想,NULL代表任何可能的價值;它不知道是哪一個。

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