沒有用於執行此類型比較的本機SQL構造。
要在逗號分隔列表中查找單個值,MySQL提供了FIND_IN_SET
函數。但是,要處理逗號分隔的值列表,要檢查每個值,看看它是否在列表中,則需要將每個單獨的值提供給FIND_IN_SET
。而這將是不起眼的。
如果硬性和快速的要求是在SQL語句中處理這種比較,我建議編寫一個函數來進行比較。
DELIMITER $$
CREATE FUNCTION upity_halo_rpi(upity VARCHAR(4000), rpi VARCHAR(4000))
RETURNS INT DETERMINISTIC
BEGIN
-- TODO: extract first element of upity
-- TODO: check if element is in rpi list
-- if it is found in the list
RETURN TRUE;
-- otherwise, split off next element
-- loop through all elements
-- if loop completes without finding a match is found, fall out
RETURN FALSE;
END$$
DELIMITER ;
通過編寫並經過徹底測試的函數,它可以在SQL語句中使用。要返回列表示該行「至少有一個」 ...
SELECT t.coupon id
, t.required_product_ids
, t.used_product_in_this_year
, upity_halo_rpi(t.used_product_in_this_year,t.required_product_ids) AS halo
FROM result t
返回:
coupon id required_product_ids used_product_in_this_year halo
--------- -------------------- ------------------------ -----
1 1,2,3,10 2,3,4,5,6,7,8,9,10,12,13 1
我不會寫的功能。我只是在展示一種可能的方法。在SQL語句中可以執行這種類型的比較操作的「如何」的一個可能的答案。
這是一個糟糕的桌子設計。爲產品更好地插入單獨的行。這隻會造成複雜性。使用計算列。 –
第2章比爾卡爾文出色的着作「SQL反模式:避免數據庫編程陷阱」的「Jaywalking」很好地涵蓋了這個話題。 https://www.amazon.com/SQL-Apatpatterns-Programming-Pragmatic-Programmers/dp/1934356557 – spencer7593
初學者設計我猜.. –