将单个 sql 列拆分为五个

Posted

技术标签:

【中文标题】将单个 sql 列拆分为五个【英文标题】:Split a single sql column into five 【发布时间】:2019-07-22 19:45:59 【问题描述】:

我试图在“ >”分隔符周围将一列分成最多五列,但我尝试过的事情没有得到解决:

我试过了

select
id, 
compoundColumn,
split(compoundColumn," > ")[1] as "first"
split(compoundColumn," > ")[2] as "second"
from table
where compoundColumn is not null

这没用,而且

这是哪一种(无论如何是第一部分,而不是第 n 部分)

select
id, 
compoundColumn,
first(split(compoundColumn," > ")) as "first"
nth(compoundColumn," > ")[n] as "second"
from table

我在这里找到了很多示例,但它们似乎都在说要使用括号,但括号会引发错误:

例外:格式错误的 SQL。更多信息:SQL 语句错误: 您的 SQL 语法有错误;检查手册 对应于您的 mysql 服务器版本,以便使用正确的语法 在 '[1] 作为 "first" from table where complexColumn IS NOT NULL' 附近 第 3 行。

【问题讨论】:

对 MySQL 不太熟悉,但我认为您不需要在列别名(“first”和“second”)周围加上引号。 你用的是什么版本的 MySQL? 我认为它的 cloudsql。 (很难说,这是谷歌应用程序制造商这个特定部分的内容)。或者,如果我想将旧 sql 作为我的 Bigquery 拉取的一部分包含在其中。 请发送一些示例数据以及您期望的数据。 【参考方案1】: SQL 中的“first”后面缺少逗号 我猜 CloudSQL 是基于一些旧版本的 MySQL,它只能使用 substring_index 进行拆分(请参阅下面的查询 - 是的,它冗长且笨拙,case 子句必须清理短字符串) 也许可以尝试使用 [offset(0)][ordinal(1)] 的括号,这对我们有用,尽管我们使用 Postgres 方言,也作为 #standardSql,而不是 #legacySql

第二点的 SQL:(fiddle)

select id,
  case when substring_index(cc,' > ',0) = cc then null else substring_index(substring_index(cc,' > ',1),' > ',-1) end as a1,
  case when substring_index(cc,' > ',1) = cc then null else substring_index(substring_index(cc,' > ',2),' > ',-1) end as a2,
  case when substring_index(cc,' > ',2) = cc then null else substring_index(substring_index(cc,' > ',3),' > ',-1) end as a3,
  case when substring_index(cc,' > ',3) = cc then null else substring_index(substring_index(cc,' > ',4),' > ',-1) end as a4,
  case when substring_index(cc,' > ',4) = cc then null else substring_index(substring_index(cc,' > ',5),' > ',-1) end as a5
from d

【讨论】:

唉,遗留 sql 不允许我使用子字符串:/.【参考方案2】:

我终于在 bigquery pull 中而不是在 appmaker 中使用 regexp extract 找到了我需要去的地方:

SELECT 
  CompoundColumn,

  REGEXP_EXTRACT(CompoundColumn+">",  r'^(.*?)>') first_number,
  REGEXP_EXTRACT(CompoundColumn+">",  r'^(?:(?:.*?)>)1(.*?)>') second_number,
  REGEXP_EXTRACT(CompoundColumn+">", r'^(?:(?:.*?)>)2(.*?)>') third_number,
  REGEXP_EXTRACT(CompoundColumn+">",  r'^(?:(?:.*?)>)3(.*?)>') fourth_number
FROM
  myTable
WHERE
  CompoundColumn IS NOT NULL

代码的 +">" 部分很难看,但我无法让它匹配不以括号结尾的字符串 (">?" 破坏了整个事情)所以我只是让它们都以括号。

【讨论】:

【参考方案3】:

所需的旧版 SQL 将是:

SELECT id, 
       compoundColumn,
       FIRST(SPLIT(compoundColumn, " > ")) AS "first",
       NTH(2, SPLIT(compoundColumn, " > ")) AS "second"
FROM table

有关SPLITFIRSTNTH 函数的更多信息,请参阅this BigQuery documentation page。

【讨论】:

以上是关于将单个 sql 列拆分为五个的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:将多个数组列拆分为行

Pyspark:将多个数组列拆分为行

如何通过拆分其中的字符串将单个列拆分为多个。 -Pandas Python [重复]

使用 R 将单个列拆分为多个观察值

SQL - 根据列的内容拆分表

BigQuery SQL 中跨多个字段的拆分函数