在这里,在查询中,当我尝试执行OR条件之前的AND条件时,它给出了错误的result..as条件,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之前执行所有命令时,它会给出正确的结果...正确的结果查询:
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_%'
)我不知道为什么...?
发布于 2011-09-29 18:16:50
因为您编写它的方式是签入到块中。
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_%'
很明显,tablename不能同时匹配'%web%summary%_4hr_ts_%'和'web_filename_username%_4hr_ts_%',所以总是假的。
下面是explain所说的
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位于顶层。这就是为什么当我对AND使用任何OR时,我总是使用括号来确保正确的求值顺序。
如果你曾经想知道为什么一条语句不能给你你期望的结果,那就在它前面解释一下,看看它会做什么。
发布于 2011-09-29 18:18:47
它依赖于它的执行顺序,通常是从左到右。
你可以使用括号来克服这个问题。
https://stackoverflow.com/questions/7595149
复制相似问题