使用 Snowflake 我正在搜索个人执行某项操作的条目。我搜索两个标识符 AGENT_NAME 和 AGENTID,然后使用 BETWEEN 搜索当天创建的操作。如果我搜索一个人,报告就会完美地工作。如果我包括第二个人,日期列会中断并开始显示所有日期。
当我运行它时,它工作得很好。
WHERE
AGENT_NAME = 'John Wick'
AND AGENT_ID = '1234'
AND ACTION_CREATED_DATE BETWEEN '2023-01-17 00:00:00.000' AND '2023-01-17 23:59:59.000'
当我尝试像这样合并多个人时,ACTION_CREATED_DATE 列会显示所有时间的结果。
WHERE
(AGENT_NAME = 'John Wick' AND AGENT_ID = '1234')
OR (AGENT_NAME = 'Tom Cruise' AND AGENT_ID = '5678')
AND ACTION_CREATED_DATE BETWEEN '2023-01-17 00:00:00.000' AND '2023-01-17 23:59:59.000'
我更愿意在同一查询中的其他地方设置 24 个不同人的 AGENT_NAME 和 AGENT_ID,因为我没有权限创建单独的表/模式等,然后在 WHERE 语句中写入他们的名字,调用预存储的数据。我尝试在 CTE、DECLARE 语句、子查询和临时表中定义个人和 ID 的列表。
我让每个人都在 WHERE 条件中使用括号和 AND/OR,但用两个人进行测试会破坏 BETWEEN 函数。
需要在
OR
周围添加额外的括号:
WHERE
((AGENT_NAME = 'John Wick' AND AGENT_ID = '1234')
OR (AGENT_NAME = 'Tom Cruise' AND AGENT_ID = '5678'))
AND ACTION_CREATED_DATE BETWEEN '2023-01-17 00:00:00.000'
AND '2023-01-17 23:59:59.000
更易读的方法是使用 IN 运算符:
WHERE
(AGENT_NAME,AGENT_ID) IN (( 'John Wick', '1234'), ('Tom Cruise','5678'))
AND ACTION_CREATED_DATE BETWEEN '2023-01-17 00:00:00.000'
AND '2023-01-17 23:59:59.000
您需要将每个 OR 中的内容以及整个 OR 放在括号中。
WHERE A OR ( b AND c) OR (d AND e) AND f AND g
最有可能应该是
WHERE (A OR ( b AND c) OR (d AND e)) AND f AND g
但是 OR 不利于整体性能,因此另一种方法是运行许多遍并将所有不同的部分合并在一起,
因此:
WHERE A AND f AND g
UNION ALL
WHERE (NOT A) AND ( b AND c) AND f AND g
UNION ALL
WHERE (NOT (A AND b AND c)) AND f AND g
...
因此为您提供 OR 树的每条腿作为不同的值集,执行速度会更快(如果您可以这样写,尽管读起来可能会非常难看,并且证明是相等/正确的)
当您有超过 7 或 8 个这样的代理时,更好的方法是将它们插入到表中,并根据需要使用该表进行左连接或带有 in 子句的子查询。