[英]Oracle SQL Rownum syntax issue
我正在嘗試編寫具有以下功能的查詢:
1)從名為EMPLOYEE的表中選擇與$ city變量與表列CITY相匹配的所有內容,以及與我的EMPLOYEE表中的NAME列相匹配的變量$ search,而不必擔心是否區分大小寫。
2)我想將結果限制為顯示11-20行
我從以下內容開始:
select * from (select rownum rn, NAME, ADDRESS, POSTAL, PHONE, MAP from EMPLOYEE) where rn >= 11 and rn <= 20;
這樣一來,我可以看到第11-20行,而不必將結果縮小到特定的城市,並且可以搜索開始的單詞。
我嘗試通過以下方法修改上述聲明以實現我的目標:
select * from (select rownum rn, NAME, ADDRESS, POSTAL, PHONE, MAP from EMPLOYEE) where rn >= 11 and rn <= 20 and CITY= $city and LOWER(NAME) like LOWER('%$search%');
我還嘗試將語句的順序更改為:
select * from (select rownum rn, NAME, ADDRESS, POSTAL, PHONE, MAP from EMPLOYEE) where CITY= $city and LOWER(NAME) like LOWER('%$search%') and rn >= 11 and rn <= 20;
我對Oracle相當陌生...
如果有人可以解釋為什么我的思維過程不起作用,也將不勝感激。
我對rownum
有內在的反應,因為它是一種奇怪的野獸。 當輸出數據時,它遞增-查詢的最后一步。 具有諷刺意味的是,如果查詢沒有返回任何數據,則rownum
永遠不會遞增。 這樣的結果是rownum > 1
將永遠不會返回結果,因為第一行從不會在結果集中返回。
我建議您改用row_number()
。 在性能上,這稍微貴一點,但是這樣做是正確的。 這是一個例子:
select e.*
rom (select row_number() over (order by name) as rn, NAME, ADDRESS, POSTAL, PHONE, MAP
from EMPLOYEE
) e
where rn >= 11 and rn <= 20;
實際上,在Oracle文檔中已經很好地記錄了rownum
的行為。
編輯:
當然,當您使用rownum
它確實可以在子查詢中工作。 您只需要將where
條件移動到子查詢中:
select e.*
from (select rownum rn, NAME, ADDRESS, POSTAL, PHONE, MAP
from EMPLOYEE e
where CITY = $city and LOWER(NAME) like LOWER('%$search%')
) e
where rn >= 11 and rn <= 20;
關於問題的第2部分:“我想將結果限制為顯示11-20行”。 嚴格來說,這個要求沒有多大意義。 Oracle將表的數據解釋為沒有任何序列的堆,並且Oracle不保證所獲取數據的順序,只要您在查詢中未指定“ order by”子句即可。 因為您沒有提到查詢輸出的排序,所以您不需要“ order by”子句。 結果,您的Oracle查詢將提供危險數據序列。
因為要將輸出行的數量限制為10條,所以查詢(無替換)的編寫方式可能如下:
select NAME, ADDRESS, POSTAL, PHONE, MAP from EMPLOYEE where rownum < 11;
關於變量替換,它取決於查詢執行的類型。 例如,從SQL * Plus,從* .sql腳本,從UNIX或其他OS上的Shell腳本,從HERE文檔,嵌入在Shell腳本中的PL / SQL調用sql腳本進行交互。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.