3

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

我试过

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 服务器版本相对应的手册,以获取正确的语法,以便在第 3 行使用 '[1] 作为表中的“第一个”,其中复合列不为 NULL'。

4

3 回答 3

2
  • SQL 中的“first”之后缺少逗号
  • 我猜 CloudSQL 是基于一些旧版本的 MySQL,它只能使用 substring_index 进行拆分(请参阅下面的查询 - 是的,它冗长而笨拙,case 子句必须清理短字符串)
  • 也许尝试使用[offset(0)]or的括号[ordinal(1)],这对我们有用,尽管我们使用 Postgres 方言,也作为#standardSql,而不是#legacySql

第二点的SQL:(小提琴

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
于 2019-07-26T11:42:51.650 回答
0

我终于在 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

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

于 2019-07-29T15:55:05.423 回答
0

所需的旧版 SQL将是:

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

有关,和函数的更多信息,请参阅此 BigQuery 文档页面。SPLITFIRSTNTH

于 2019-07-31T16:04:38.533 回答