gpt4 book ai didi

PostgreSQL 查询优先级

转载 作者:行者123 更新时间:2023-11-29 13:06:55 24 4
gpt4 key购买 nike

在查询中,当我尝试在 AND 条件之前执行 OR 条件时,它给出了错误的结果。因为 web_filename_username_4hr_ts_201109 也被包含在内。错误结果查询:

SELECT tablename FROM pg_tables
WHERE schemaname = 'public'
and (tablename like 'web%_4hr_ts_%'
and tablename not like 'webs%_4hr_ts_%'
and tablename not like 'webr%_4hr_ts_%'
or tablename like '%web%summary%_4hr_ts_%'
and tablename not like 'web_filename_username%_4hr_ts_%'
)
;

但是当我在 ORing 之前执行所有 AND 时,它给出了正确的结果......正确结果查询:

SELECT tablename
FROM pg_tables
WHERE schemaname = 'public'
and (tablename like 'web%_4hr_ts_%'
and tablename not like 'webs%_12hr_ts_%'
and tablename not like 'webr%_4hr_ts_%'
and tablename not like 'web_filename_username%_4hr_ts_%'
or tablename like '%web%summary%_4hr_ts_%'
)

我不知道为什么.....???????

最佳答案

因为您编写它的方式会检查到 block 。

tablename like 'web%_4hr_ts_%'
and tablename not like 'webs%_4hr_ts_%'
and tablename not like 'webr%_4hr_ts_%'

tablename like '%web%summary%_4hr_ts_%'
and tablename not like 'web_filename_username%_4hr_ts_%'

现在显然表名不能同时匹配'%web%summary%_4hr_ts_%''web_filename_username%_4hr_ts_%'所以这总是错误的。

解释一下

 Nested Loop  (cost=0.00..28.55 rows=1 width=64)
Join Filter: (c.relnamespace = n.oid)
-> Seq Scan on pg_class c (cost=0.00..27.45 rows=1 width=72)
Filter: ((relkind = 'r'::"char") AND (((relname ~~ 'web%_4hr_ts_%'::text) AND (relname !~~ 'webs%_4hr_ts_%'::text) AND (relname !~~ 'webr%_4hr_ts_%'::text)) OR ((relname ~~ '%web%summary%_4hr_ts_%'::text) AND (relname !~~ 'web_filename_username%_4hr_ts_%'::text))))
-> Seq Scan on pg_namespace n (cost=0.00..1.09 rows=1 width=4)
Filter: (n.nspname = 'public'::name)

如您所见,它添加的括号表明 OR 位于顶层。这就是为什么当我将任何 OR 与 AND 一起使用时,我总是使用括号来确保正确的评估顺序。

如果你想知道为什么一个语句没有给你你所期望的,只需在它前面解释一下,看看它会做什么。

关于PostgreSQL 查询优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com