【问题标题】:Splitting row in 2 columns将行拆分为 2 列
【发布时间】:2019-03-21 16:16:04
【问题描述】:

尝试按存在“/”分隔符的语言拆分数据,使用此查询它可以工作,但是当没有“/”时,行转到法语列,如果没有,我希望法语列为空'/' 并且数据应该在英文栏中。它是按站点 id 排序的,所以只有 id 412 有法语。

SELECT
s.siteid,
s.notes, --This is the column that CSI uses for the description.
split(s.notes,'/') [safe_OFFSET(0)] French,
split(s.notes,'/') [safe_OFFSET(1)] english
FROM AloomaTestBeta.SCSERVICES s

siteid  notes                           French                  english
412     Le cardio-/ Cardio Tennis .     Le cardio-tennis        Cardio Tennis 
412     Le cardio-/Cardio Tennis        Le cardio-tennis        Cardio Tennis 
412     La ligue de / Drop-In Tennis    La ligue de tennis      Drop-In Tennis 
411     An extended duration            An extended duration    null                    
411     Increase flexibility            Increase flexibility    Null    

也尝试使用 case 语句,但是当没有“/”分隔符时它开始给我 null。

SELECT
s.siteid,
s.notes, --This is the column that CSI uses for the description.
case when  s.siteid = 412 then split(s.notes,'/') [safe_OFFSET(0)] else null end as French,
split(s.notes,'/') [safe_OFFSET(1)] english
FROM AloomaTestBeta.SCSERVICES s

siteid  notes                           French                  english
412     Le cardio-/ Cardio Tennis .     Le cardio-tennis        Cardio Tennis 
412     Le cardio-/Cardio Tennis        Le cardio-tennis        Cardio Tennis 
412     La ligue de / Drop-In Tennis    La ligue de tennis      Drop-In Tennis 
411     An extended duration            null                     null                   
411     Increase flexibility            null                      Null                  

这就是我想要的结果

siteid  notes                           French                  english
412     Le cardio-/ Cardio Tennis .     Le cardio-tennis        Cardio Tennis 
412     Le cardio-/Cardio Tennis        Le cardio-tennis        Cardio Tennis 
412     La ligue de / Drop-In Tennis    La ligue de tennis      Drop-In Tennis 
411     An extended duration            null                    An extended duration 
411     Increase flexibility            Null                    Increase flexibility

【问题讨论】:

  • 请创建一些简化的示例数据,您可以将它们作为实际文本 (而不是图像) .我无法阅读这些图像,如果您不想努力使其具有可读性,我不确定有多少人会努力打开图像并放大它们。

标签: sql google-bigquery google-query-language


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT
  s.siteid,
  s.notes, --This is the column that CSI uses for the description.
  IF(v, SPLIT(s.notes,'/')[OFFSET(0)], NULL) French,
  IF(v, SPLIT(s.notes,'/')[SAFE_OFFSET(1)], SPLIT(s.notes,'/')[OFFSET(0)]) English
FROM `AloomaTestBeta.SCSERVICES` s, UNNEST([s.notes LIKE '%/%']) v

您可以使用您问题中的示例数据进行测试,使用上面的示例,如下例所示

#standardSQL
WITH `AloomaTestBeta.SCSERVICES` AS (
  SELECT 412 siteid, 'Le cardio-/ Cardio Tennis' notes UNION ALL
  SELECT 412, 'Le cardio-/Cardio Tennis' UNION ALL
  SELECT 412, 'La ligue de / Drop-In Tennis' UNION ALL
  SELECT 411, 'An extended duration' UNION ALL
  SELECT 411, 'Increase flexibility' 
)
SELECT
  s.siteid,
  s.notes, --This is the column that CSI uses for the description.
  IF(v, SPLIT(s.notes,'/')[OFFSET(0)], NULL) French,
  IF(v, SPLIT(s.notes,'/')[SAFE_OFFSET(1)], SPLIT(s.notes,'/')[OFFSET(0)]) English
FROM `AloomaTestBeta.SCSERVICES` s, UNNEST([s.notes LIKE '%/%']) v  

结果

Row siteid  notes                           French          English  
1   412     Le cardio-/ Cardio Tennis       Le cardio-      Cardio Tennis    
2   412     Le cardio-/Cardio Tennis        Le cardio-      Cardio Tennis    
3   412     La ligue de / Drop-In Tennis    La ligue de     Drop-In Tennis   
4   411     An extended duration            null            An extended duration     
5   411     Increase flexibility            null            Increase flexibility       

如果您了解上述工作原理 - 您已准备好采用更优雅的解决方案

#standardSQL
SELECT
  s.siteid,
  s.notes, --This is the column that CSI uses for the description.
  SPLIT(s.notes,'/')[SAFE_OFFSET(v)] French,
  SPLIT(s.notes,'/')[SAFE_OFFSET(1 - v)] English
FROM `AloomaTestBeta.SCSERVICES` s, UNNEST([IF(s.notes LIKE '%/%', 0, 1)]) v

【讨论】:

    【解决方案2】:

    假设 siteid 将使用'/' 标识记录。这应该有效:

    case when s.siteid = 412 then split(s.notes, '/')[SAFE_OFFSET(0)] else null end as French,
    case when s.siteid = 412 then split(s.notes, '/')[SAFE_OFFSET(1)] else split(s.notes, '/')[SAFE_OFFSET(0)] end as English
    

    玩一些虚拟数据:

    #standardSQL
    WITH test_table AS (
      SELECT 412 as siteid, "test/test" as notes union all
      SELECT 413 as siteid, "test" as notes
    )
    SELECT 
    case when siteid = 412 then split(notes, '/')[SAFE_OFFSET(0)] else null end as French,
    case when siteid = 412 then split(notes, '/')[SAFE_OFFSET(1)] else split(notes, '/')[SAFE_OFFSET(0)] end as English
    FROM test_table
    

    它给出了以下结果,根据您的描述,这应该是期望的结果。

    Row French  English  
    1   test    test     
    2   null    test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多