这是我的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()))
答案 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
只是虚拟过滤器,实际上应该是针对您的情况考虑的任何过滤器