SQL在SQL查询内部(在WHERE子句内部的CASE / IF)直接创建SQL

时间:2018-09-18 11:20:22

标签: sql if-statement google-bigquery case

这是我的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用户=(当前会话用户)并且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())

WHat是在 WHERE 子句中使用if语句的正确方法吗?

解决方案:

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 :(得分:0)

问题的答案是查询的SELECT部分中的一列:

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

我不知道这与您提供的代码有何关系。

答案 1 :(得分:0)

以下BigQuery标准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只是虚拟过滤器,实际上应该是针对您的情况考虑的任何过滤器