繁体   English   中英

Snowflake:使用多个 AND/OR 语句会破坏我的日期过滤器

[英]Snowflake: Using multiple AND/OR statements breaks my date filter

我正在使用 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 function。

它需要在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 树的每条腿作为不同的 SETS 值,将执行得更快(如果你可以这样写,尽管它可能读起来更难看,并且证明是相等的/正确的)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM