---
# System prepended metadata

title: SQL msSQL ROW_NUMBER()+CHARINDEX()SQL問題 SQL子查詢
tags: [SQL]

---

# SQL msSQL ROW_NUMBER()+CHARINDEX()SQL問題 SQL子查詢
----
###### tags: `SQL`

[可以做好多事情的SQL子查詢](https://ithelp.ithome.com.tw/articles/10219497)

## 搜尋

**!!舊搜尋法 不要再使用 有問題!!**

這是原本使用的搜尋
看起來很正常但如果加入搜尋法後就會有嚴重的問題

### 搜尋範例1\(錯誤)

```sql=

SELECT * FROM
	(SELECT ROW_NUMBER()
		OVER (
			ORDER BY id
			)　AS row_id, * FROM [admin_basic]
	) AS aTable WHERE CHARINDEX('o', admin_acc) > 0 AND row_id > 0 AND row_id <= 2 ORDER BY row_id
```
首先要先知道資料庫中會被搜尋出來的筆數是多少
所以將`row_id` 條件移除
符合查詢的只有三筆資料

```sql=
SELECT * FROM
	(SELECT ROW_NUMBER()
		OVER (
			ORDER BY id
			)　AS row_id, * FROM [admin_basic]
	) AS aTable WHERE CHARINDEX('o', admin_acc) > 0
```

![](https://i.imgur.com/yC3X6gc.png)

## 分頁

假設分頁是以下方式進行
那上方圖片再 顯示每頁2數資料下
應該是會有 兩頁 共三筆資料

**!! 以上是錯的思考法 !!**

```
每頁2 筆資料的話 
最大roe_id 與最小row_id 公式為以下
        page_1            page_2               page_3
        0=1-1*2            2 =2-1*2            4=3-1*2
        2=1*2              4 =2*2              6=3*2
        
        1                    3                    5
        2                    4                    6
```
### 搜尋範例1\(錯誤)  輸出

輸出結果只有一筆資料
看 畫線處

![](https://github.com/bestRDJ333/noteImg/raw/main/img/75.png)

### 搜尋範例1\(錯誤) 原因

這是由於SQL 子查詢而出得問題
**錯誤產生的原因是因為 先排序後搜尋**
**應該是要 先搜尋後排序**

所以應該是改成下面的排序方法

![](https://raw.githubusercontent.com/bestRDJ333/noteImg/main/img/77.png)

SQL 應該改成已下方式

```sql=
SELECT * FROM
	(SELECT ROW_NUMBER()
		OVER (
			ORDER BY id
			)　AS row_id, * FROM [admin_basic] WHERE CHARINDEX('o', admin_acc) > 0
	) AS aTable WHERE row_id > 2 AND row_id <= 4 ORDER BY row_id
```

![](https://github.com/bestRDJ333/noteImg/raw/main/img/78.png)

![](https://github.com/bestRDJ333/noteImg/raw/main/img/79.png)


