簡體   English   中英

Oracle SQL Rownum語法問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM