SQL создает «Admin» прямо внутри SQL-запроса (CASE / IF внутри предложения WHERE) - PullRequest
0 голосов
/ 18 сентября 2018

Это мой SQL:

WHERE 
CASE 
    WHEN (UC.USER = SESSION_USER() AND UC.full_access = 1) 
    THEN (FROS.IsVoided = false) 
    ELSE (FROS.IsVoided = false AND UC.USER = SESSION_USER()) 
END

Мне нужно, чтобы ЕСЛИ user = to (текущий пользователь сеанса) и full_access = 1 дисплей X else Y , я мог бы предоставить больше кода и таблиц, но из общего вида, может кто-нибудь найти какие-то распространенные ошибки, которые я сделал?

Как альтернатива у меня есть эта идея:

WHERE 
IF(UC.USER = SESSION_USER() AND UC.full_access= 1, FROS.IsVoided = false, FROS.IsVoided = false AND UC.USER = SESSION_USER())

Какой правильный способ использования оператора if внутри WHERE предложения?

РЕШЕНИЕ:

WHERE IF(((SELECT full_access FROM `TABLE` WHERE user = SESSION_USER())= 1), (FROS.IsVoided = false), (FROS.IsVoided = false AND UC.USER = SESSION_USER()))

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Ниже приведен пример для 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 - это всего лишь фиктивный фильтр, который в действительности должен быть тем фильтром, который вы имеете в виду для своего случая

0 голосов
/ 18 сентября 2018

Ответом на ваш вопрос является столбец в SELECT части запроса:

SELECT (CASE WHEN UC.USER = SESSION_USER() AND UC.full_access = 1 
             THEN 'X' ELSE 'Y'
        END) as what_you_asked_for

Я не знаю, как это относится к предоставленному вами коду.

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