線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1765
推到 Plurk!
推到 Facebook!

SQL查詢語法的問題

尚未結案
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-15 17:39:39 IP:61.59.xxx.xxx 未訂閱
請問 如資料有A001,A002,A003 ~ A009 請問再下列語法中如T1=A002 T2=A008 但查詢的結果會是A003~A008,為何查詢結果的首筆不會是A002,不是已經設為 FD1 >= T1,怎麼不會包含T1之值?,但尾筆(<=)之結果卻有 SQL.Clear; SQL.Add('Select * from AAA'); SQL.Add'AND '+FD1+'>='''+TRIM(T1)+'%'+'''AND '+FD1+'<='''+TRIM(T2)+'%'+''''); SQL.Add('Order by FD1'); SQL.Close; SQL.Open;
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-15 17:49:23 IP:61.216.xxx.xxx 未訂閱
改成這樣 SQL.Clear; SQL.Add('Select * from AAA'); SQL.Add('WHERE FD1 BETWEEN ' #39 TRIM(T1) #39 ' AND ' #39 TRIM(T2) #39); SQL.Add('Order by FD1'); SQL.Close; SQL.Open; TRY TRY SEE
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-15 20:17:03 IP:211.72.xxx.xxx 未訂閱
原因是因為你加了 % 進去, 所以會發生 >= 不包含而 <= 會包含到, 這是字串比對的結果沒錯, 正確的解法除了 chih 兄的 between 以外, 將你的 sql command 中的 % 拿掉也就可以了!! 列一下含有 % 時的字串比較結果: 'A001' < 'A001%' 'A009' < 'A009%' 所以會有不正確的查詢結果!!
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-16 00:04:08 IP:61.59.xxx.xxx 未訂閱
感謝chih的指示,亦感謝timhuang,讓我更明瞭其道理 補充:少寫了WHERE這一段希望不要誤會SQL.Add('Where FD1 is not Null'); 我用BETWEEN確實就OK了,但還有一些疑問,假設資料有A001...B001.... 1.當T1無值時,代表重頭開始至T2 SQL.Add('AND ' FD1 '>=''''' 'AND ' FD1 '<=''' TRIM(T2) ''''); OR 加 % SQL.Add('AND ' F_NAME '>=''''' 'AND ' FD1 '<=''' TRIM(T_STR2) '%' ''''); //-->結果還是不含最後一筆,與先前之問題好像有點矛盾,先前雖有誤,但會有最後一筆,在此卻不會包含最後一筆. 2.當T2無值時,代表從T1開始至結尾,含T1僅有開頭字首,如T1=A SQL.Add('AND ' FD1 '>=''' TRIM(T_STR1) '''');//-->結果OK 3.如何當查詢值可能只輸入起始字元,如只輸入A ~ B (代表A**~B**) 我用了BETWEEN的做法,如果查詢值完全符合,如A001~Z001結果OK, 如查詢值只有A ~Z則末筆不會有包含Z的這一筆,所以會想加入% 可否請與指點指點 THANKS
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-16 00:33:54 IP:61.221.xxx.xxx 未訂閱
1. 所謂不含最後一筆是不是你的 T2 是 B001 但你的最後一筆是 B004 ?? 可以的話, 可否描述再詳細一些. 3. 可以使用 left 函數 如: left(FD1,1) >= 'A' and left(FD1,1) <= 'B' 當然使用 BETWEEN 亦可 left(FD1,1) between 'A' and 'B' 你若是直接下 FD1 >= 'A' and FD1 <= 'Z' 的話, 'Zxxxx' 都是大於 'Z' 的, 所以不會在條件中哦. 所以 Axxxx, Bxxxx ..... Yxxxx 都會出現, 但是 Zxxxx 就不會出現了. 另外, 你可能誤會了 % 的意義, % 只對 like 指令有效, 你把他寫入字串中, 就只是一個字串值, 不會有 like 中的 % 代表任何字元的意義哦~ 發表人 - timhuang 於 2003/04/16 00:37:45
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-16 02:16:09 IP:61.59.xxx.xxx 未訂閱
Tanks fo timhuang.. 這麼一說我以了解原來是其<>之關係 如資料為 AA001.AB002...BA001.BB002...CA001.CB001 如查詢條件為AB002~BA001 --結果--> AB002.AC003....BA001--條件完全符合故結果合理 如查詢條件為A~B --結果--> AA001.AB002.AC003....(直至BA001以前) 因是>B,所以只有BA001以前的資料. Tahnks 我懂了... 是否有可能將查詢條件為A~B之查詢結果為--> AA001.AB002.AC003....BA001.BB002...(包含A.B開頭範圍內之所有資料) 也就是暨between二值之範圍,該值又是類似萬用字元 Between like Value1 and like Velue2 ..不過好像沒有這樣的語法
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-16 08:26:18 IP:211.74.xxx.xxx 未訂閱
如果你是要以第一個字元作為萬用查詢的話.. 改成這樣 SQL.Clear; SQL.Add('Select * from AAA'); SQL.Add('WHERE (FD1 LIKE ' #39 '%' copy(T1,1,1) '%' #39 ')' ' OR (FD1 LIKE ' #39 '%' copy(T2,1,1) '%' #39 ')'); SQL.Add('Order by FD1'); SQL.Close; SQL.Open; TRY TRY SEE
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-16 09:39:40 IP:211.76.xxx.xxx 未訂閱
引言: 是否有可能將查詢條件為A~B之查詢結果為--> AA001.AB002.AC003....BA001.BB002...(包含A.B開頭範圍內之所有資料) 也就是暨between二值之範圍,該值又是類似萬用字元 Between like Value1 and like Velue2 ..不過好像沒有這樣的語法
若是要以 A. B 開頭的所有資料的話, 用 like 加 % 的方式是比較理想的, 例: select * from table where (FD1 like 'A%') or (FD1 like 'B%') 要是一定要用範圍式的話, 如 between 或 >, < 這樣的方式, 則必須配合 left 用: select * from table where left(FD1,1) >= 'A' and left(FD1,1) <='B' 或 select * from table where left(FD1,1) between 'A' and 'B' 如同我前一篇的第3點.
系統時間:2024-07-01 4:09:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!