SQL中的复杂文本比较

时间:2016-09-16 03:27:30

标签: sql sql-server

假设我有一个表格结果

---------------------------------------------------------
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,但没有成功。

2 个答案:

答案 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字符串函数来操作数据。

我不推荐你的数据库结构,但我喜欢谜题,这个很有趣,谢谢你的挑战。