Рассмотрим пример ниже
#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 )
, где квалифицированные структуры «взяты» из оператора выбора в сравнении с константами, как в первом примере