2011-09-29 121 views
1

在這裏,當我試圖之前和條件執行OR條件查詢它給web_filename_username_4hr_ts_201109也被包括在內.. 錯誤結果查詢錯誤result..as:PostgreSQL的查詢優先

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_%' 
     ) 
    ; 

但是,當我執行所有,並讓正確的結果或運算之前... 正確的結果查詢:

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_%' 
     ) 

我不知道爲什麼.... ?????????

+1

我編輯你的代碼位。 AND和OR不能很好地混合。 – wildplasser

+0

爲什麼不嘗試添加括號「(」和「)」 – Florjon

回答

2

因爲你寫它的方式,它會檢查的塊。

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_%'因此多數民衆贊成總是會是假的。

這是什麼解釋說,關於它

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是在頂層。這就是爲什麼當Im使用任何OR與AND時,我總是使用括號來確保正確的評估順序。

如果你曾經想知道爲什麼聲明中不給你什麼,你想到剛粘在它前面的解釋,看看它要做的事情。

+0

表[PostgreSQL的運算符優先級](http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html #SQL-優先級表)。正如你所看到的,'AND'綁定在'OR'之前。如有疑問,請添加括號以反對。 –

0

及其取決於其順序執行的,這通常是從左到右。

您可以使用括號在走到這一步。