首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL查询优先级

PostgreSQL查询优先级
EN

Stack Overflow用户
提问于 2011-09-29 17:22:55
回答 2查看 449关注 0票数 1

在这里,在查询中,当我尝试执行OR条件之前的AND条件时,它给出了错误的result..as条件,web_filename_username_4hr_ts_201109也被包括在内。错误的结果查询:

代码语言:javascript
复制
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之前执行所有命令时,它会给出正确的结果...正确的结果查询:

代码语言:javascript
复制
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_%'
       )

我不知道为什么...?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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所说的

代码语言:javascript
复制
 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时,我总是使用括号来确保正确的求值顺序。

如果你曾经想知道为什么一条语句不能给你你期望的结果,那就在它前面解释一下,看看它会做什么。

票数 2
EN

Stack Overflow用户

发布于 2011-09-29 18:18:47

它依赖于它的执行顺序,通常是从左到右。

你可以使用括号来克服这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7595149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档