我有一個存儲有關供應商信息的表。其中,大約有10個布爾列表示供應商屬於哪個部門。供應商可以屬於多個部門。返回MySQL中至少有2個或更多布爾列爲'true'的記錄
如何查詢表以查找具有多個標記爲true的布爾列的供應商?
我tbl_vendor_departments
列:
vendor_id
(VARCHAR)vendor_name
(VARCHAR)clothing
(布爾)automotive
(布爾)lawn_garden
(布爾)tools
(布爾)...等等。
我有一個存儲有關供應商信息的表。其中,大約有10個布爾列表示供應商屬於哪個部門。供應商可以屬於多個部門。返回MySQL中至少有2個或更多布爾列爲'true'的記錄
如何查詢表以查找具有多個標記爲true的布爾列的供應商?
我tbl_vendor_departments
列:
vendor_id
(VARCHAR)vendor_name
(VARCHAR)clothing
(布爾)automotive
(布爾)lawn_garden
(布爾)tools
(布爾)...等等。
我認爲布爾實際上被視爲小整數(0或1)。在這種情況下,您可以添加的所有布爾字段,並檢查結果> 1.
....
WHERE
clothing + automotive + lawn_garden + .... + tools > 1
在MySQL中,布爾只是一個整數0或1,那麼您就可以使用算術:
SELECT ...
FROM tbl_vendor_departments
WHERE (clothing + automotive + lawn_garden + tools) >= 2
嚴格來說,在MySQL中,零爲假,任何非零值爲真。因此,如果您的「布爾」列包含大於1的真值(例如42),您可能會得到意想不到的結果。要進行補償,您可以將真值倒置爲假,然後再次倒置。這應該將42轉換爲0,然後返回1.使用括號來控制運算符優先級。
SELECT ...
FROM tbl_vendor_departments
WHERE (
(NOT NOT clothing) +
(NOT NOT automotive) +
(NOT NOT lawn_garden) +
(NOT NOT tools)
) >= 2
儘管如此,不要嘗試使用其他SQL實現。大多數不會以與整數算術兼容的方式實現boolean
,因此上述查詢會(並且應該按照ANSI SQL)生成一個錯誤。對於這些,你可以使用CASE表達式從真正轉化爲1:
SELECT ...
FROM tbl_vendor_departments
WHERE (
CASE clothing WHEN true THEN 1 ELSE 0 END +
CASE automotive WHEN true THEN 1 ELSE 0 END +
CASE lawn_garden WHEN true THEN 1 ELSE 0 END +
CASE tools WHEN true THEN 1 ELSE 0 END
) >= 2
我不知道這是否是有保證的功能(但懷疑這是),但布爾字段設置爲true,以我的經驗,始終爲1,當爲假時,爲零。因此,只需添加所有字段並選擇總數爲2或更多的記錄即可完成這項工作。
優秀的答案和超級信息以及。我會檢查作爲答案,但Golez Trol確實首先得到它,它確實工作......但肯定。 – Ofeargall
是的,當@GolezTrol發佈他的時候,我正在輸入我的答案。他/她獲得更快的信用! :) –
哇!我永遠不會想到雙'NOT'聲明。有點結構化的查詢巫術那裏。 – Ofeargall