【问题标题】:How to count from split string in mysql like this example如何像这个例子一样从mysql中的拆分字符串中计数
【发布时间】:2022-01-27 07:03:24
【问题描述】:

如何操作数据就像mysql中的这个例子

例如:

icd diagnose
A00 1 diagnoseA00 1
B34 2;A00 9;A39 5 diagnoseB34 2;diagnoseA00 9;diagnoseA39 5

进入

icd diagnose
A00 1 diagnoseA00 1
B34 2 diagnoseB34 2
A00 9 diagnoseA00 9
A39 5 diagnoseA39 5

我试图使用 substring_index 但它只需要第一个字符串(1)或最后一个字符串(-1),如下表所示

icd diagnose
A00 1 diagnoseA00 1
B34 2 diagnoseB34 2;diagnoseA00 9;diagnoseA39 5

【问题讨论】:

  • 你试过什么?请运行SELECT version(); 来检查 MySQL 版本。
  • 什么是最大。每个 CSV 值的值数量?如果icddiagnose 的实心值中单独值的数量不同,您需要什么输出?
  • FanoFN:就像我针对我的问题制作的表格一样。 mysql版本为10.4.22-MariaDB

标签: php mysql database split


【解决方案1】:

我认为你可以在icddiagnose 上使用explode() 函数,然后将结果与返回数据合并

阅读更多https://www.php.net/manual/en/function.explode.php

【讨论】:

    【解决方案2】:

    类似这样的:

    SELECT DISTINCT 
           CASE WHEN icd LIKE '%;%' 
              THEN SUBSTRING_INDEX(SUBSTRING_INDEX(icd,';',seq),';',-1) 
              ELSE SUBSTRING_INDEX(icd,';',seq) END AS icd2,
           CASE WHEN diagnose LIKE '%;%' 
              THEN SUBSTRING_INDEX(SUBSTRING_INDEX(diagnose,';',seq),';',-1) 
              ELSE SUBSTRING_INDEX(diagnose,';',seq) END AS diagnose2
     FROM mytable m 
     CROSS JOIN seq_1_to_20 s;
    

    我发现 MariaDB 的一个奇妙之处在于它有一个 built-in sequence engine。这使得一些操作更容易,特别是在你想要做的事情上。您使用SUBSTRING_INDEX() 的想法是解决此类任务的正确想法之一。但是,它不像 1 SUBSTRING_INDEX() 那样简单直接,也不需要任何其他操作。在您的情况下,您还需要 CASE 表达式。添加DISTINCT 以返回提取的icddiagnose value 的唯一组合,您将获得预期的输出。

    Demo fiddle

    【讨论】:

      【解决方案3】:

      你可以用 substring_index() 解决这个问题。请查看我的db<>fiddle

      此代码正常工作的唯一条件是 - 你应该 同一行的两个字段中的子字符串数量相同。否则这个 会坏的。

      示例:

      SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.diagnose, ';', n.n), ';', -1) value1,
      SUBSTRING_INDEX(SUBSTRING_INDEX(t.icd, ';', n.n), ';', -1) value2
        FROM t t CROSS JOIN 
      (
         SELECT a.N + b.N * 10 + 1 n
           FROM 
          (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
         ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
          ORDER BY n
      ) n
       WHERE n.n <= 1 + (LENGTH(t.diagnose) - LENGTH(REPLACE(t.diagnose, ';', '')));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-05
        • 2013-02-22
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        相关资源
        最近更新 更多