【问题标题】:sql procedure to loop through string and input its characters to selectsql过程循环遍历字符串并输入要选择的字符
【发布时间】: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)。

标签: mysql sql mysql-workbench


【解决方案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;

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 2021-10-28
    • 1970-01-01
    • 2015-01-17
    • 2020-02-16
    • 2014-09-19
    • 2023-03-23
    相关资源
    最近更新 更多