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 循环遍历表并删除特定列中包含特定字符串的所有行