假设我有一个表格结果
---------------------------------------------------------
coupon id| required_product_ids|used_product_in_this_year
---------------------------------------------------------
1 |1,2,3,10 |2,3,4,5,6,7,8,9,10,12,13
如何通过SQL检查used_product_in_this_year
是否至少有一个required_product_ids
。
我尝试使用像关键字一样的SQL,但没有成功。
答案 0 :(得分:0)
没有用于执行此类比较的本机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语句中执行“如何”这种类型的比较操作的一种可能的答案。
答案 1 :(得分:0)
如何在不更改数据库结构的情况下执行此操作。
在MYSQL中(已测试):
select * from TableName
where concat(',', used_product_in_this_year, ',') regexp concat(',',replace(required_product_ids,',',',|,'),',')
将这个Regex结构与您的表一起使用,并使用一些mysql字符串函数来操作数据。
我不推荐你的数据库结构,但我喜欢谜题,这个很有趣,谢谢你的挑战。