sql过程循环遍历字符串并输入要选择的字符

Posted

技术标签:

【中文标题】sql过程循环遍历字符串并输入要选择的字符【英文标题】:sql procedure to loop through string and input its characters to select 【发布时间】:2020-09-29 09:08:32 【问题描述】:

有没有办法在 sql 中创建能够产生以下内容的过程:

SET @teststr = '(1, 2, 3)';
select sum(products_storage.product_price)
from (select 1 as id union all
      select 2 as id union all
      select 3 as id
     ) i join products_storage
        query_products_in_stock

有没有一种方法可以循环遍历 teststr 字符串并从中选择每个 ID 并获得相同的结果,而不是手动选择部分?

【问题讨论】:

WHERE FIND_IN_SET(id, @teststr)。但不会使用索引。最好的方法是解析 CSV(如果 mysql 版本允许 - 使用 JSON_TABLE)。 【参考方案1】:

我想你是在问find_in_set()

select sum(products_storage.product_price)
from query_products_in_stock qpin
where find_in_set(qpin.id, replace(replace(replace(@testtr, ', ', ','), '(', ''), ')', '')

当然,如果字符串表示为这样会更简单:

SET @teststr = '1,2,3';

这就引出了为什么不将查询指定为的问题:

select sum(products_storage.product_price)
from query_products_in_stock qpin
where qpin.id like (1, 2, 3);

【讨论】:

“where in”的问题是它不会找到重复值,字符串实际上是'1,2,3',没有括号。但是使用 '1, 1, 1' 它不会返回 3x1 的总和:/ @qwerty 。 . .这不是你在这里问的问题。如果您希望每次出现都计算重复值,那么我会推荐您问题中的方法。【参考方案2】:

这适用于 Mysql5.5+

SET @teststr = '1, 2, 3';


SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) name
FROM
  (SELECT 1 n UNION ALL SELECT 2
   UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN (select @teststr name from dual) tablename
  ON CHAR_LENGTH(tablename.name)
     -CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1
ORDER BY
   n;

【讨论】:

以上是关于sql过程循环遍历字符串并输入要选择的字符的主要内容,如果未能解决你的问题,请参考以下文章

汇编:遍历一系列字符并交换它们

DataTables 循环遍历表并删除特定列中包含特定字符串的所有行

PHP for循环中怎么让字符串超过固定特定长度后自动换行?

PHP循环遍历多维数组并更改值

C语言for循环遍历argv中的字符串,一个一个字符打印

输入一行字符(可能包含英文字母,数字字符等其他字符),要求统计其中单词的个数?