Возникла проблема с функцией Case When в SQL - PullRequest
0 голосов
/ 21 ноября 2018

Итак, у меня проблема с функцией Case When, которую я пытаюсь запустить.Теоретически для меня, по крайней мере, он должен быть в состоянии потерпеть неудачу в первом случае «Когда» и перейти ко второму «Когда», но это не так.Ниже приведены примеры данных, на которые я смотрю:

HM_9991256_RDR_LL_BA_NONE_REDDEAD
HW_1005489_HWA_AA_DG_NONE_HELLOWORLD
GG_8504807_BBA_CL_OI_NONE_GOODGAME
100_BB_4186482_CGA_IG_NONE_CALIFORNIA
200_HB_48558012_DDA_EV_NONE_EVEONLINE
900_GI_55488941_CA_DV_NONE_BATTLEFIELD

Случай, когда функция, которую я выполняю в данный момент:

CASE WHEN split(LINE_ITEM, '_')[OFFSET(1)] NOT LIKE '%[0-9]%' THEN regexp_replace(split(LINE_ITEM, '_')[OFFSET(2)], r'[^0-9]', '')
     WHEN split(LINE_ITEM, '_')[OFFSET(0)] NOT LIKE '%[0-9]%' THEN regexp_replace(split(LINE_ITEM, '_')[OFFSET(1)], r'[^0-9]', '')
  END AS ID_VARIABLE

Первоначальная мысль для меня, когда я вижуэто если у него нет чисел в позиции OFFSET(1), то он будет захватывать OFFSET(2), если в позиции OFFSET(0) нет чисел, он будет захватывать OFFSET(1).Однако я сталкиваюсь с тем, что оно попадет в первое WHEN утверждение и никогда не перейдет во второе WHEN.Моя конечная цель заключается в следующем:

ID_VARIABLE
  9991256
  1005489
  8504807
  4186482
  48558012
  55488941

Но в настоящее время я получаю следующее:

ID_VARIABLE
  4186482
  48558012
  55488941

Как вы можете видеть, я пропускаю первый раздел идентификаторов.Но я думаю, что я действительно близок, но либо я пишу что-то неправильно, либо не вижу что-то правильно.Любая помощь будет здорово с этим!

-Maykid

1 Ответ

0 голосов
/ 21 ноября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  IF(
    SAFE_CAST(i1 AS INT64) IS NULL, 
    i2, 
    IF(SAFE_CAST(i0 AS INT64) IS NULL, i1, NULL)
  ) ID_VARIABLE
FROM `project.dataset.table`, 
  UNNEST([STRUCT<i0 STRING, i1 STRING, i2 STRING>(
    SPLIT(LINE_ITEM, '_')[OFFSET(0)], 
    SPLIT(LINE_ITEM, '_')[OFFSET(1)], 
    SPLIT(LINE_ITEM, '_')[OFFSET(2)]
  )])

Если применить к фиктивным данным из вашего вопроса, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'HM_9991256_RDR_LL_BA_NONE_REDDEAD' LINE_ITEM UNION ALL
  SELECT 'HW_1005489_HWA_AA_DG_NONE_HELLOWORLD' UNION ALL
  SELECT 'GG_8504807_BBA_CL_OI_NONE_GOODGAME' UNION ALL
  SELECT '100_BB_4186482_CGA_IG_NONE_CALIFORNIA' UNION ALL
  SELECT '200_HB_48558012_DDA_EV_NONE_EVEONLINE' UNION ALL
  SELECT '900_GI_55488941_CA_DV_NONE_BATTLEFIELD' 
)
SELECT 
  IF(
    SAFE_CAST(i1 AS INT64) IS NULL, 
    i2, 
    IF(SAFE_CAST(i0 AS INT64) IS NULL, i1, NULL)
  ) ID_VARIABLE
FROM `project.dataset.table`, 
  UNNEST([STRUCT<i0 STRING, i1 STRING, i2 STRING>(
    SPLIT(LINE_ITEM, '_')[OFFSET(0)], 
    SPLIT(LINE_ITEM, '_')[OFFSET(1)], 
    SPLIT(LINE_ITEM, '_')[OFFSET(2)]
  )])

результат будет таким, как ожидалось:

Row ID_VARIABLE  
1   9991256  
2   1005489  
3   8504807  
4   4186482  
5   48558012     
6   55488941       

Если по какой-то причине вы связаны с CASE WHEN заявлением - ниже должно работать для вас

#standardSQL   
SELECT 
  CASE WHEN REGEXP_CONTAINS(i1, r'[^0-9]') THEN REGEXP_REPLACE(i2, r'[^0-9]', '')
       WHEN REGEXP_CONTAINS(i0, r'[^0-9]') THEN REGEXP_REPLACE(i1, r'[^0-9]', '')
    END AS ID_VARIABLE      
FROM `project.dataset.table`, 
  UNNEST([STRUCT<i0 STRING, i1 STRING, i2 STRING>(
    SPLIT(LINE_ITEM, '_')[OFFSET(0)], 
    SPLIT(LINE_ITEM, '_')[OFFSET(1)], 
    SPLIT(LINE_ITEM, '_')[OFFSET(2)]
  )])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...