Это мой 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

Мне нужно, чтобы IF user = to (текущий пользователь сеанса) и full_access = 1 отображал X иначе 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()))
0
user10208908 18 Сен 2018 в 14:20

2 ответа

Лучший ответ

Ниже приведен пример для 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
Mikhail Berlyant 18 Сен 2018 в 18:57

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

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

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

0
Gordon Linoff 18 Сен 2018 в 11:23