2009-07-01 86 views
5

我正在與一個客戶端合作,該客戶端使用1=1來啓動Oracle中幾乎所有的WHERE子句。原諒我的無知,但這不是一個沒有操作?這種用法有什麼不利後果嗎?在Oracle中,啓動1 = 1的SQL查詢的WHERE子句有用嗎?

這裏有一個擦洗例如:

SELECT gpz.zname 
     ,gpp.pname 
FROM  table1 gpp INNER JOIN table2 gpz ON gpz.p_id = gpp.p_id 
WHERE 1=1 
     AND gpp.active = 1 
     AND gpz.active = 1 

回答

18

它做了簡化動態SQL生成。基本上,每個條件都可以作爲AND <condition>添加,而不必將第一個條件視爲特殊條件(在WHERE之前,而不是在AND之前),或者甚至擔心是否應該有WHERE條款。

所以只要把它寫成易用性或可以說是懶惰。

+1

1的懶惰,由一個或兩個線簡化PL/SQL並且在數據庫上造成這種SQL非常糟糕。太糟糕,如果由於某種原因,他們需要設置cursor_sharing = FORCE-不確定,但我認爲CBO會遇到「WHERE:1 =:2 AND ...」並相應地優化它!有趣的發現... – 2009-07-02 12:59:24

0

他們可能已經建立了來自子字符串的查詢。

根據業務規則的匹配,這可能是一種只用AND來構建它的方法,因此您根本不必關心哪個是您的第一個條件。

我不會這樣做。

3

如果他們動態構建查詢,則應檢查他們是否使用綁定變量。從文字構建查詢需要額外的解析,可能會限制可伸縮性,並且還會大大增加SQL注入攻擊的風險。

where 1 = 1 and my_id = :b1; 

(然後定義綁定變量的值)

通常比好得多:

where 1 = 1 and my_id = 123456;