Ниже приведен пример для BigQuery Standard SQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 col1, 2 col2, 3 col3 UNION ALL
SELECT 4, 5, 6
), users_access AS (
SELECT 'user1@gmail.com' user, 1 full_access UNION ALL
SELECT 'user2@gmail.com', 0
)
SELECT col1, col2, col3
FROM `project.dataset.table`
WHERE 1 = (SELECT full_access FROM users_access WHERE LOWER(user) = LOWER(SESSION_USER()))
OR (0 = (SELECT full_access FROM users_access WHERE LOWER(user) = LOWER(SESSION_USER()))
AND col1 > 2)
Результат для user1@gmail.com:
Row col1 col2 col3
1 1 2 3
2 4 5 6
Результат для user2@gmail.com:
Row col1 col2 col3
1 4 5 6
Результат для user3@gmail.com:
Row col1 col2 col3
Query returned zero records.
Выше можно слегка изменить рефакторинг, как показано ниже (с тем же поведением для пользователей с full_access = 1 или full_access = 0 или тех, кто вообще отсутствует в списке)
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 col1, 2 col2, 3 col3 UNION ALL
SELECT 4, 5, 6
), users_access AS (
SELECT 'user1@gmail.com' user, 1 full_access UNION ALL
SELECT 'user2@gmail.com', 0
)
SELECT * EXCEPT(access)
FROM `project.dataset.table`,
UNNEST([(SELECT full_access FROM users_access WHERE LOWER(user) = LOWER(SESSION_USER()))]) access
WHERE access = 1
OR (access = 0 AND col1 > 2)
Примечание: col1 > 2
- это всего лишь фиктивный фильтр, который в действительности должен быть тем фильтром, который вы имеете в виду для своего случая