Mysql
python的truthy / falsy / bool概念是否有等效的sql檢查?
我正在嘗試查找連接到 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 子句需要對每個欄位進行查詢。
獎勵:我用 a
COUNT(*) 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
代表任何可能的價值;它不知道是哪一個。