【问题标题】:Complex split comma value in MySQLMySQL中的复杂拆分逗号值
【发布时间】:2017-11-23 19:40:49
【问题描述】:

下面是我的问题

我有字符串“1,2,3,4,5”。我想拆分这些值并放入一个临时表但我想插入 1 个位置,我的意思是输出将是

N°1 | N°2
---------
1   |  2
2   |  3
3   |  4
4   |  5

我希望有人能解决我的问题。谢谢!

【问题讨论】:

  • 您是想在单个 MySQL 查询中执行此操作,还是使用某种编程语言与 MySQL 交互?如果您使用的是编程语言,也许您可​​以指定目前为止您尝试过的语言和内容。
  • 我只需要在 MySQL 中做,我可以在 PHP 中做,但这不是一个选项
  • SO 不是免费的编码服务。发布您的查询。如果它不起作用,我们可以提供帮助。

标签: mysql database split comma


【解决方案1】:

对于如下语法创建的简单表格

CREATE TABLE `demo2` (
  `no1` int(11) NOT NULL,
  `no2` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

您可以尝试如下的存储过程。

在每次插入时为字符串中的每个值添加 +1 的示例

CREATE PROCEDURE `dowhile`(IN `s1` VARCHAR(255))
BEGIN
SET @length = CHAR_LENGTH(`s1`);
SET @counter = 1;
WHILE @counter <= @length DO
    SET @char = SUBSTRING(`s1`, @counter, 1);
    IF STRCMP(@char, ",") <> 0 THEN
    INSERT INTO `demo2` (`no1`,`no2`) VALUES (@char,@char+1);
    END IF;
    SET @counter = @counter + 1;
  END WHILE;
  END

在字段no1 中添加nth 元素和在no2 中添加nth+1 字符串中的算术元素的示例(不包括逗号)

CREATE PROCEDURE `dowhile`(IN `s1` VARCHAR(255))
BEGIN
    SET @length = CHAR_LENGTH(`s1`);
    SET @counter = 1;
    WHILE @counter <= @length DO
        SET @next_el_counter = @counter + 2;
        SET @char = SUBSTRING(`s1`, @counter, 1);
        IF STRCMP(@char, ",") <> 0 THEN
        INSERT INTO `demo2` (`no1`,`no2`) VALUES (@char,SUBSTRING(`s1`, @next_el_counter, 1));
        END IF;
        SET @counter = @counter + 1;
      END WHILE;
      END

别忘了叫它...

CALL `dowhile`('1,2,3,4,5');

【讨论】:

  • 喜欢这种方法(已经 +1 了)。不过有一个问题:INSERT INTO demo2` (no1,no2) VALUES (@char,@char+1);` 是否仅在字符串以 1 递增时才有效,或者我在这里遗漏了什么?
  • @Harshil 如果您的输入字符串是a,b,c,d,e,那么它将添加no1 a,b,c,d,eno2 a+1,b+1,c+1,d+1,e+1
  • 是的,这就是我所理解的。如果字符串如下所示,它将不起作用:e,d,c,b,a
  • @Harshil 对于像e,d,c,b,a 这样的字符串,您会期望输出e+1,d+1,c+1,b+1,a+1。它不像现在那样排序。在这种情况下,它需要一些修改。
  • @Harshil 这仅适用于这个特定的算术字符串,例如 1,2,3,4,52,3,4,5,6... 或任何类似的以 1 递增的排序。在任何其他情况下,这不起作用并需要修改。我的意思是它不会在循环的第一个插入中将输入字符串的第二个元素放入字段no2。在这种情况下,我将添加一个小编辑。
【解决方案2】:

首先,请您通过this LINK链接来了解将分隔列表存储在列中的缺点。

无论如何,如果你使用MySql来完成这个任务,那么你需要使用Procedure和Function来完成,如下所示:

第 1 步:创建一个函数,以在给定位置使用分隔符, 拆分数据。

CREATE FUNCTION SPLIT_STR
(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

现在,上述函数将只针对给定位置拆分数据。为了分割整个字符串,我们需要迭代这个函数。这是我们的第 2 步。

第二步:创建Procedure来迭代上述函数;

CREATE PROCEDURE ABC(IN fullstr varchar(1000))
   BEGIN
      DECLARE a INT Default 0;
      DECLARE str VARCHAR(255);
      DECLARE prev VARCHAR(255);
      simple_loop: LOOP
         SET a=a+1;
         IF a=1 THEN
             SET prev=SPLIT_STR(fullstr,",",a);
             SET a=a+1;
         END IF;
         SET str=SPLIT_STR(fullstr,",",a);         
         IF str='' THEN
            LEAVE simple_loop;       
         END IF;                    
         #Do Inserts into temp table here with str going into the row
         insert into t1 values (prev,str);
         SET prev=str;
   END LOOP simple_loop;

第 3 步: 调用程序:

       call abc(columnName);

第 4 步:temp 表中获取数据:

select *
from temp;

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 2011-07-26
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多