Фильтр по электронной почте просто предоставляет вам адрес электронной почты текущего зарегистрированного пользователя. Вы должны использовать его для фильтрации своего запроса. Я разработал такой простой тест:
with sample as (
select "a" as userId, 10 as age, "usera@gmail.com" as email
UNION ALL
select "b" as userId, 20 as age, "userb@gmail.com" as email
UNION ALL
select "c" as userId, 30 as age, "userc@gmail.com" as email
), auth as (
select "usera@gmail.com" as user, "usera@gmail.com" as permission
UNION ALL
select "userb@gmail.com" as user, "usera@gmail.com" as permission
UNION ALL
select "userb@gmail.com" as user, "userb@gmail.com" as permission
UNION ALL
select "admin@gmail.com" as user, ".*" as permission
)
select * from sample
where REGEXP_CONTAINS(email,(select STRING_AGG(permission,"|") from auth where auth.user = @DS_USER_EMAIL))
У меня есть таблица sample
с вашими данными. Я создал таблицу auth
со ссылкой между электронной почтой пользователя и авторизацией просмотра.
В последнем запросе я использую регулярное выражение, чтобы проверить, авторизована ли строка или нет. У администратора есть значение .*
для просмотра всех данных. Другой - это просто агрегирование всех строк, разделенных вертикальной чертой |
(ИЛИ на языке регулярных выражений)
EDIT
Сила BigQuery - это соответствие со стандартом SQL2011, и рабочий запрос в postgres аналогичен. Для шаблона регулярного выражения используйте SIMILAR TO
. Посмотрите на шаблон регулярного выражения администратора, это не обычное регулярное выражение, но оно работает
string_agg
- это существующая функция
with sample as (
select 'a' as userId, 10 as age, 'usera@gmail.com' as email
UNION ALL
select 'b' as userId, 20 as age, 'userb@gmail.com' as email
UNION ALL
select 'c' as userId, 30 as age, 'userc@gmail.com' as email
), auth as (
select 'usera@gmail.com' as user, 'usera@gmail.com' as permission
UNION ALL
select 'userb@gmail.com' as user, 'usera@gmail.com' as permission
UNION ALL
select 'userb@gmail.com' as user, 'userb@gmail.com' as permission
UNION ALL
select 'admin@gmail.com' as user, '%' as permission
)
select * from sample
where email SIMILAR TO (select STRING_AGG(permission,'|') from auth where auth.user = @DS_USER_EMAIL)
Запрос работает, но его нельзя использовать с Datastudio, потому что @DS_USER_EMAIL
существует только с BigQuery
Обходной путь - использовать Cloud SQL федеративный запрос . И последний запрос - это сочетание обоих движков db
with sample as (
SELECT * FROM EXTERNAL_QUERY("gbl-imt-homerider-basguillaueb.us.vertx-postgres", """ select 'a' as userId, 10 as age, 'usera@gmail.com' as email
UNION ALL
select 'b' as userId, 20 as age, 'userb@gmail.com' as email
UNION ALL
select 'c' as userId, 30 as age, 'userc@gmail.com' as email""")), auth as (
SELECT * FROM EXTERNAL_QUERY("gbl-imt-homerider-basguillaueb.us.vertx-postgres", """ select 'usera@gmail.com' as user, 'usera@gmail.com' as permission
UNION ALL
select 'userb@gmail.com' as user, 'usera@gmail.com' as permission
UNION ALL
select 'userb@gmail.com' as user, 'userb@gmail.com' as permission
UNION ALL
select 'admin@gmail.com' as user, '.*' as permission"""))
select * from sample
where REGEXP_CONTAINS(email,(select STRING_AGG(permission,"|") from auth where auth.user = @DS_USER_EMAIL))