Повторение тех же операций в SQL SELECT - PullRequest
0 голосов
/ 25 мая 2018

Я анализирую столбец в разных таблицах, и у меня есть операция, которая постоянно повторяется.Есть ли способ избежать избыточности, например, определить переменную?Вот как выглядит мой запрос:

SELECT 
  CAST(CONCAT('0x', composed) as INT64)>>1 AS FIRST_VALUE, 
  CAST(CONCAT('0x', composed) as INT64)>>2 AS SECOND_VALUE, 
  ...

, и я хотел бы иметь что-то вроде:

SELECT 
  INTERMEDIATE_VALUE = CAST(CONCAT('0x', composed) as INT64)
  INTERMEDIATE_VALUE>>1 AS FIRST_VALUE, 
  INTERMEDIATE_VALUE>>2 AS SECOND_VALUE, 
  ...

, чтобы операция приведения / конкатата выполнялась только один раз для каждого значения вместоn раз.

Редактировать: Я также хотел бы использовать INTERMEDIATE_VALUE с предложением WHERE

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Ниже описан подход, который я нашел наиболее оптимальным / чистым для таких случаев (BigQuery Standard SQL)

#standardSQL
SELECT 
  INTERMEDIATE_VALUE>>1 AS FIRST_VALUE, 
  INTERMEDIATE_VALUE>>2 AS SECOND_VALUE,
  ...
FROM `project.dataset.your_table`, 
UNNEST([CAST(CONCAT('0x', composed) AS INT64)]) INTERMEDIATE_VALUE  
WHERE INTERMEDIATE_VALUE > <some_value>   

Например,

#standardSQL
WITH `project.dataset.your_table` AS (
  SELECT '1' composed UNION ALL
  SELECT 'FF'
)
SELECT 
  composed,
  INTERMEDIATE_VALUE,
  INTERMEDIATE_VALUE>>1 AS FIRST_VALUE, 
  INTERMEDIATE_VALUE>>2 AS SECOND_VALUE
FROM `project.dataset.your_table`, 
UNNEST([CAST(CONCAT('0x', composed) AS INT64)]) INTERMEDIATE_VALUE  
WHERE INTERMEDIATE_VALUE > 10

дает результат как

Row composed    INTERMEDIATE_VALUE  FIRST_VALUE SECOND_VALUE     
1   FF          255                 127         63   
0 голосов
/ 25 мая 2018

простое решение:

select 
  INTERMEDIATE_VALUE>>1 AS FIRST_VALUE, 
  INTERMEDIATE_VALUE>>2 AS SECOND_VALUE, 
  ....
from (
     select CAST(CONCAT('0x', composed) as INT64) as INTERMEDIATE_VALUE 
     from .... 
) 
where INTERMEDIATE_VALUE = 'something'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...