【问题标题】:use csv values as a column in query in mysql使用 csv 值作为 mysql 查询中的列
【发布时间】:2021-08-24 09:20:54
【问题描述】:

我有一些来自外部来源的值/ID,例如需要在使用前进行清理/类型转换的日志。所以例如如果我有这样的价值观:

800, 776, 7803, 827, 91, 976, 908

我希望能够对mysql中的每个值执行一些操作。我希望能够做这样的事情:

Select myCol*10
FROM (SELECT (800, 776, 7803, 827, 91, 976, 908) as myCol from dual);

但它失败并出现错误

错误 1241 (21000):操作数应包含 1 列。

我能找到的允许选择多行的最接近的查询是this。但这需要在每个值前面加上 UNION ALL SELECT 例如

SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9

另一个可行的选项是在内存表中,甚至像this 这样的东西。但对于看似如此简单的事情来说,这些似乎有点过头了。

【问题讨论】:

  • 什么是精确 MySQL 版本?什么是最大。每个 CSV 字符串的值数量?
  • @Akina 版本:5.7.30,最大值为 1000。
  • 对于您的版本 - 迭代存储过程似乎是唯一有用的选项。当然,您也可以使用带有生成或静态数字表的 double-SUBSTRING_INDEX 使用 CSV 到行集转换...
  • 这对sql来说绝不是一件简单的事情。 Sql 旨在处理结构化数据库中的数据,而不是您通过复制粘贴以任何随机格式提供的任意数据集。一些数据库客户端应用程序可以将粘贴在其 gui 中的数据转换为创建表语句(大多数基于 web 的 sql fiddles 都具有此功能),但该功能由客户端应用程序提供,而不是由 sql 提供。 JSON_TABLE() 将是您在 mysql 中尝试做的最接近的事情,但这仅在 v8.0 中可用,并且需要您的数据为 json 格式。在 sql 中这样做并不值得 atm。
  • 修复你的数据模型!不要在一个字符串中存储多个值。期间。

标签: mysql sql


【解决方案1】:

版本:5.7.30,最大值为 1000。- M-WaJeEh

可能的解决方案。

  1. 创建存储从 1 到 1000 整数的服务表。您可以在您的数据库、某些服务数据库甚至mysql 数据库中创建它。

  2. 使用下一个代码(使用问题的模式):

SELECT myCol*10
FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@arg, ',', numbers.num), ',', -1) as myCol 
       FROM mysql.numbers 
       WHERE numbers.num <= LENGTH(@arg) - LENGTH(REPLACE(@arg, ',', '')) + 1 ) source;

@arg 是 CSV 字符串 ('800, 776, 7803, 827, 91, 976, 908') 的占位符。

当然,您可以将 CSV 中值的数量提供到 WHERE 表达式中,而不是逗号计数。

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0042c8c9e5ffe46eee7a57e628ef75f8

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多