IN можно использовать с ключами, состоящими из нескольких частей, используя синтаксис конструктора структуры? - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы знать значение следующего синтаксиса, взятого из https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#in-operators

(Key1, Key2) IN ( (12,34), (56,78) )
(Key1, Key2) IN ( SELECT (table.a, table.b) FROM table )

Значение - отображать строки, когда ключ1 имеет значение 12 или 34, а ключ2 имеет значение 56 или 78. Я прав? Если бы не простой пример, было бы полезно разобраться.

1 Ответ

0 голосов
/ 03 июля 2018

Рассмотрим пример ниже

#standardSQL
WITH t AS (
  SELECT 1 id, 12 key1, 13 key2 UNION ALL
  SELECT 2, 12, 34 UNION ALL
  SELECT 3, 56, 57 UNION ALL
  SELECT 4, 56, 78
)
SELECT * FROM t
WHERE (key1 = 12 AND key2 = 34)
OR (key1 = 56 AND key2 = 78)   

Теперь вы можете переписать его, как показано ниже

#standardSQL
WITH t AS (
  SELECT 1 id, 12 key1, 13 key2 UNION ALL
  SELECT 2, 12, 34 UNION ALL
  SELECT 3, 56, 57 UNION ALL
  SELECT 4, 56, 78
)
SELECT * FROM t
WHERE (key1, key2) IN ((12,34),(56,78)) 

, что делает его (зависит от предпочтений пользователя) более читабельным

в обоих случаях вывод

Row id  key1    key2     
1   2   12      34   
2   4   56      78     

синтаксис (key1, key2) объединяет эти два значения в одно STRUCT, а затем сравнивает их с другими STRUCT - (12,34) и (56,78)

То же самое со вторым примером

(Key1, Key2) IN ( SELECT (table.a, table.b) FROM table )

, где квалифицированные структуры «взяты» из оператора выбора в сравнении с константами, как в первом примере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...