2013-01-15 78 views
1

我有一個這樣的查詢,它使用call_id上的索引,而如果我在值中添加_,那麼它會從索引搜索更改爲seq搜索。postgres中的特殊字符_

explain analyze 
DELETE 
FROM completedcalls 
WHERE call_id like '[email protected]'; 


                  QUERY PLAN               
-------------------------------------------------------------------------------------------------------------------------------- 
Delete on completedcalls (cost=0.00..8.67 rows=1 width=6) (actual time=0.036..0.036 rows=0 loops=1) 
    -> Index Scan using i_call_id on completedcalls (cost=0.00..8.67 rows=1 width=6) (actual time=0.034..0.034 rows=0 loops=1) 
     Index Cond: ((call_id)::text = '[email protected]'::text) 
     Filter: ((call_id)::text ~~ '[email protected]'::text) 
Total runtime: 0.069 ms 
(5 rows) 

本聲明:

explain analyze 
DELETE 
FROM completedcalls 
WHERE call_id like '[email protected]_1'; 

返回此執行計劃:

QUERY PLAN              
----------------------------------------------------------------------------------------------------------------------- 
Delete on completedcalls (cost=0.00..39548.64 rows=84 width=6) (actual time=194.313..194.313 rows=0 loops=1) 
    -> Seq Scan on completedcalls (cost=0.00..39548.64 rows=84 width=6) (actual time=194.310..194.310 rows=0 loops=1) 
     Filter: ((call_id)::text ~~ '[email protected]_1'::text) 
Total runtime: 194.349 ms 
(4 rows) 

我的問題是如何在查詢逃避這些字符。在Python中使用psycopg2。

+2

爲什麼你首先使用'LIKE'?顯然你不想要一個通配符搜索,而是一個平等條件。所以你應該使用'='而不是'LIKE' –

回答

3

你需要躲避_用反斜槓,像這樣:

DELETE FROM completedcalls 
WHERE call_id like '[email protected]\_1'; 

另外,如果你不想要的模式匹配,它可能會更有意義,使用=而不是LIKE

+0

是否有任何postgres轉義函數可用?或字符列表逃脫? – sharafjaffri

+0

@sharafjaffri:你只需要轉義SQL通配符:'_'和'%' –

+0

@sharafjaffri最好使用簡單的'='運算符,而不是每個'_'和'%'char轉義。 –