討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 掌握Salesforce雲端管理秘訣 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
請問複合式查詢條件的問題
更改我的閱讀文章字型大小
作者 : jau1229(weechao)
[ 貼文 66 | 人氣 6742 | 評價 90 | 評價/貼文 1.36 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/8/31 上午 02:08:22
就是在畫面上提供使用多個查詢欄位查詢資料
但我如何知道使用者選了哪些欄位為查詢條件
進而下sql select的指令呢?
為此小小問題,不吝賜教,感激不盡
作者 : epeople(epeople) 人氣指數超過10000點
[ 貼文 138 | 人氣 11219 | 評價 600 | 評價/貼文 4.35 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jau1229註記此篇回應為最佳解答 2004/8/31 上午 11:00:15
我的想法是..
一開始可以先寫好select語法,如..
dim sql as String = "select * from Table where 1=1 "
1=1的意思為永遠成立,
然後再一個一個檢查每各欄位中的值,如果欄位中有輸入值的話,在將條件串接起來,如...
sql = sql & "AND AA=" & Me.TextBox1.Text


>就是在畫面上提供使用多個查詢欄位查詢資料
>但我如何知道使用者選了哪些欄位為查詢條件
>進而下sql select的指令呢?
>為此小小問題,不吝賜教,感激不盡
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jau1229註記此篇回應為很有道理 2004/8/31 下午 02:56:13
可以先以一支 SQL 來取得資料庫中的所有資料 , 並產生一個 DataTable.
然後再依條件以 DataTable.Select() 來過濾資料 .
作者 : hkln(HKLN.net) Perl卓越專家Oracle卓越專家資訊類作業求救優秀好手一般優秀好手程式設計甘苦談優秀好手C#卓越專家貼文超過2000則人氣指數超過100000點
[ 貼文 2135 | 人氣 122272 | 評價 14600 | 評價/貼文 6.84 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jau1229註記此篇回應為很有道理 2004/8/31 下午 08:08:05
>就是在畫面上提供使用多個查詢欄位查詢資料
>但我如何知道使用者選了哪些欄位為查詢條件
>進而下sql select的指令呢?

小弟多提供兩種方法,不知是否可行:
1) 用 Parameters

2) 如果是用 Oracle 的話,Oracle 有一個叫 NVL 函數(不知其它資料庫有沒有類似的),
例如在 SQL 內寫:
WHERE COLUMN_NAME = NVL(:PARAMETER_NAME, COLUMN_NAME)

如果使用者有輸入 :PARAMETER_NAME ,就會變成:
WHERE COLUMN_NAME = :PARAMETER_NAME

如果使用者沒有輸入,那麼 :PARAMETER_NAME 就變成 NULL :
WHERE COLUMN_NAME = COLUMN_NAME

這就好像廢除了 :PARAMETER 一樣。優點是您不需要在程式碼檢查它有沒有輸入東西。
作者 : jau1229(weechao)
[ 貼文 66 | 人氣 6742 | 評價 90 | 評價/貼文 1.36 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 上午 12:37:43

>可以先以一支 SQL 來取得資料庫中的所有資料 , 並產生一個 DataTable.
>然後再依條件以 DataTable.Select() 來過濾資料 .

我算還蠻新的ADO.NET初學者,對相關語法還不熟。
可不可以舉個較明顯的例子,麻煩你了,謝謝你。
作者 : jau1229(weechao)
[ 貼文 66 | 人氣 6742 | 評價 90 | 評價/貼文 1.36 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 上午 12:42:44

>小弟多提供兩種方法,不知是否可行:
>1) 用 Parameters
>
>2) 如果是用 Oracle 的話,Oracle 有一個叫 NVL 函數(不知其它資料庫有沒有類似的),
>例如在 SQL 內寫:
>WHERE COLUMN_NAME = NVL(:PARAMETER_NAME, COLUMN_NAME)
>
>如果使用者有輸入 :PARAMETER_NAME ,就會變成:
>WHERE COLUMN_NAME = :PARAMETER_NAME
>
>如果使用者沒有輸入,那麼 :PARAMETER_NAME 就變成 NULL :
>WHERE COLUMN_NAME = COLUMN_NAME
>
>這就好像廢除了 :PARAMETER 一樣。優點是您不需要在程式碼檢查它有沒有輸入東西。
嗯,這方法看起來很好用哦,可是我找不到SQL有NVL或類似功能的函數。
或許有,只是還找不著吧。
很謝謝你提供的方法。
作者 : hkln(HKLN.net) Perl卓越專家Oracle卓越專家資訊類作業求救優秀好手一般優秀好手程式設計甘苦談優秀好手C#卓越專家貼文超過2000則人氣指數超過100000點
[ 貼文 2135 | 人氣 122272 | 評價 14600 | 評價/貼文 6.84 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 上午 09:03:33
>>如果使用者有輸入 :PARAMETER_NAME ,就會變成:
>>WHERE COLUMN_NAME = :PARAMETER_NAME
>>
>>如果使用者沒有輸入,那麼 :PARAMETER_NAME 就變成 NULL :
>>WHERE COLUMN_NAME = COLUMN_NAME
>>
>>這就好像廢除了 :PARAMETER 一樣。優點是您不需要在程式碼檢查它有沒有輸入東西。
>嗯,這方法看起來很好用哦,可是我找不到SQL有NVL或類似功能的函數。
>或許有,只是還找不著吧。
>很謝謝你提供的方法。


喔!我忘記了還可以用 Short Circuit OR 的寫法:

WHERE (:PARAMETER_NAME IS NULL OR (COLUMN_NAME = :PARAMETER_NAME))

好像 A OR B 一樣,當 A 是 TRUE 的時候,就不會檢查 B ,
當 A 是 FALSE 的時候,才會檢查 B 。

(不太肯定在 SQL Server 行不行)
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 上午 11:00:35
SQL Server 中好像沒這樣的語法 , 沒看過 ....
作者 : hkln(HKLN.net) Perl卓越專家Oracle卓越專家資訊類作業求救優秀好手一般優秀好手程式設計甘苦談優秀好手C#卓越專家貼文超過2000則人氣指數超過100000點
[ 貼文 2135 | 人氣 122272 | 評價 14600 | 評價/貼文 6.84 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 下午 01:05:40
SQL Server 好像可以用 ISNULL:
http://msdn.microsoft.com/library/en-us/tsqlref/ts_ia-iz_6mek.asp
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 下午 01:10:29
ISNULL 可以 , 但沒有 NVL 那樣的東西 (沒看過)
作者 : hkln(HKLN.net) Perl卓越專家Oracle卓越專家資訊類作業求救優秀好手一般優秀好手程式設計甘苦談優秀好手C#卓越專家貼文超過2000則人氣指數超過100000點
[ 貼文 2135 | 人氣 122272 | 評價 14600 | 評價/貼文 6.84 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/1 下午 01:54:43
>ISNULL 可以 , 但沒有 NVL 那樣的東西 (沒看過)

對,Oracle 的 NVL 要改寫成 SQL Server 的 ISNULL,
原理應該差不多,都是靠 SQL 自動判斷參數是否 NULL ,
不過實作起來能否成功,我就不知道了。
作者 : kanny1103(卡住)
[ 貼文 26 | 人氣 734 | 評價 30 | 評價/貼文 1.15 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/3 下午 04:52:38
我的想法是..
一開始可以先寫好select語法,如..
dim sql as String = "select * from Table where 1=1 "
1=1的意思為永遠成立,
然後再一個一個檢查每各欄位中的值,如果欄位中有輸入值的話,在將條件串接起來,如...
sql = sql & "AND AA=" & Me.TextBox1.Text


>就是在畫面上提供使用多個查詢欄位查詢資料
>但我如何知道使用者選了哪些欄位為查詢條件
>進而下sql select的指令呢?
>為此小小問題,不吝賜教,感激不盡



先判斷欄位是否有輸入再決定是否串接
例如上述例子:
dim sql as String = "select * from Table where 1=1 "
if me.textbox1.text.trim <> "" then
    sql = sql & "AND AA=" & Me.TextBox1.Text
end if
..................
以此類推
combobox就看你要用selectedindex或是value、text來判斷都可以
其他的....想一下就可以了

作者 : hkln(HKLN.net) Perl卓越專家Oracle卓越專家資訊類作業求救優秀好手一般優秀好手程式設計甘苦談優秀好手C#卓越專家貼文超過2000則人氣指數超過100000點
[ 貼文 2135 | 人氣 122272 | 評價 14600 | 評價/貼文 6.84 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/3 下午 06:24:49
>然後再一個一個檢查每各欄位中的值,如果欄位中有輸入值的話,在將條件串接起來,如...
>sql = sql & 'AND AA=' & Me.TextBox1.Text


用串接 SQL 的方法可能會出現 SQL Injection 的保安漏洞問題。
 板主 : 小朱
 > ADO.NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - ADO.NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
ADO.NET
1 小朱 1520 
2 識丁 280 
3 吳馨琳 270 
4 小台 180 
5 Snaking 140 
6 mark 140 
7 好說 120 
8 ammon 100 
9 toyboy 70 
10 再見男人 50 
ADO.NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.078125