【问题标题】:Delimited Function in SQL to Split Data between semi-colonSQL中的分隔函数在分号之间拆分数据
【发布时间】:2017-08-24 05:24:13
【问题描述】:

我有下面的数据。

我只对程序B感兴趣。如何使用SQL语法将其更改为下表?

以下是我的语法,但它没有给我想要的东西。

SELECT
  SUBSTRING(Program, 0, CHARINDEX(';', Program)),
  SUBSTRING(
      SUBSTRING(Program, CHARINDEX(';', Program) + 1, LEN(Program)),
      0,
      CHARINDEX(';', SUBSTRING(Program, CHARINDEX(';', Program) + 1,
                               LEN(Program)))),
  REVERSE(SUBSTRING(REVERSE(Program), 0, CHARINDEX(';', REVERSE(Program)))),
  File_Count
FROM DataBase1
WHERE Program LIKE '%B%'

感谢大家的帮助。

阿迪

【问题讨论】:

  • 您使用哪种数据库?在一个程序单元格中可能有多个 B 值?
  • 我使用的是 Microsoft SQL 2012。是的,不同的单元格中有多个 B 值。它们不一样。
  • 顺便谢谢PM。用于编辑我的问题。这是我第一次发帖=D。真的很感激。
  • 请阅读meta.stackoverflow.com/questions/285551/… 和接受的答案

标签: sql sql-server tsql split


【解决方案1】:

试试这个:

SELECT
CASE WHEN PATINDEX('%B[0-9][0-9]%', Program)>0 THEN SUBSTRING(Program, PATINDEX('%B[0-9][0-9]%', Program) - 1, 4) 
     WHEN PATINDEX('%B[0-9]%', Program)>0 THEN SUBSTRING(Program, PATINDEX('%B[0-9]%', Program) - 1, 3) 
     ELSE '' END

FROM DataBase1 

第一个WHEN负责提取模式B[0-9][0-9],即当B后跟两位数时,第二个负责提取B后跟一位数。当没有找到匹配项时,默认返回空字符串。如果您有兴趣提取模式 B 后跟三位数字,则需要添加另一个 when(作为第一种情况),输入模式 B[-9][0-9][0-9] 而不是 B[0-9][0-9] 并将最后一个数字从 4 更改为 5(字符串长度为提取)。

PATINDEX 返回找到匹配的位置。

【讨论】:

  • 太棒了!谢谢迈克尔。有用 !!!如果一个单元格中有多个 B,例如 C1;D1;A4;B10;B11,如何分隔 B10;B11?使用您的语法,它们被保存在一起。再次感谢您的帮助。真的很感激。
【解决方案2】:

如果你使用 PostgreSql,你可以尝试下一个解决方案。

首先用数据创建临时表:

CREATE TABLE temp.test AS (
  SELECT 'A1, B1' AS program, 1 AS file_count
  UNION
  SELECT 'B2', 1
  UNION
  SELECT 'A2, B3', 1
  UNION
  SELECT 'B4', 1
  UNION
  SELECT 'A3, B5', 2
  UNION
  SELECT 'B6', 2
  UNION
  SELECT 'B7', 2
  UNION
  SELECT 'B8', 1
  UNION
  SELECT 'B9', 1
  UNION
  SELECT 'C1;D1;A4;B10', 1
  UNION
  SELECT 'C2;D2;B11', 1
  UNION
  SELECT 'C3,D3,A5,B12', 1
  UNION
  SELECT 'C4;B14;D4;B11,B13', 1
);

我建议在一个程序单元格中可以包含多个 B 值(最后选择)。

之后使用 regexp_matches 查找单元格中的所有 B 并选择每个 file_count 值(第一个内部选择),然后由每个程序求和:

SELECT
  b_program,
  sum(file_count)
FROM (
       SELECT
         (SELECT regexp_matches(program, 'B\d+')) [1] AS b_program,
         file_count
       FROM temp.test
       WHERE upper(program) LIKE '%B%') bpt
GROUP BY b_program
ORDER BY b_program;

【讨论】:

  • 感谢 HAYmbl4 的帮助。我将在我的论文中保留此语法以供将来参考。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2019-07-23
相关资源
最近更新 更多