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

請教SQL 查詢 where 的問題

尚未結案
ericyang
一般會員


發表:2
回覆:8
積分:2
註冊:2002-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-02 19:16:49 IP:218.160.xxx.xxx 未訂閱
我有一供應商 Table Supplier,欄位有 MAK_ID Varchar 8 廠商代號 若有一筆資料, 代號為 C (一個 Character) 若User 在 採購檔,輸入廠商代號 'C ' --> 2 Characters, C 空白字 我用 select * from Supplier where MAK_ID='C ' 去 Check 是否有此廠商代號,結果竟然是抓的到資料 請問如何讓 SQL Server 能夠分辨 'C' <> 'C ' 要從select 指令去做 or 我 MS SQL Server 設定上的問題 ? 不知大家有無此問題, 謝謝 Eric
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-03 08:39:46 IP:210.65.xxx.xxx 未訂閱
Hi ericyang,    In SQL Statement 可以用以下寫法區分    select * from Supplier where MAK_ID like 'C ' 至於是否是MS SQL Server 設定上的問題,我就不知道了 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-03 09:20:25 IP:218.163.xxx.xxx 未訂閱
ericyang 你好: 可能你寫入資料(MAK_ID)時, 字串即已經帶空白字元. 建議看看"SET ANSI_PADDING" 的說明, 你可簡單select 字串長度以確認一下 "select datalength(MAK_ID) from Supplier".
nancy
一般會員


發表:8
回覆:19
積分:10
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-03 14:55:05 IP:61.222.xxx.xxx 未訂閱
我猜想會不會是你MAK_ID欄位型態的問題, 如果你設定的資料型態為CHAR(2), 那麼雖然你的廠商代號只有一個character, 但實際上SQL Server會自動幫你補上一個空白,所以MAK_ID欄位真正的值其實是'C ',要解決這個問題,只要將資料型態改為varchar就可以了
ericyang
一般會員


發表:2
回覆:8
積分:2
註冊:2002-04-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-03 23:38:01 IP:218.167.xxx.xxx 未訂閱
引言: Hi ericyang, In SQL Statement 可以用以下寫法區分 select * from Supplier where MAK_ID like 'C ' 至於是否是MS SQL Server 設定上的問題,我就不知道了 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ---------------------------------- < face="Verdana, Arial, Helvetica"> Fishman 你好,使用 like 不加任何萬用字元,的確可以正確 select 出 'C' and 'C ' 不同的資料,只是用 like 指令,去執行一次,速度感覺上好像會慢一點(不知是否是心理感覺),而且怪怪的, 這樣 = 運算有何作用呢 ? 是否以後要做完全比對,都要使用 like 而捨 = 運算子 ? 是否有設定 = 就是要用完全比對的設定 ?
ericyang
一般會員


發表:2
回覆:8
積分:2
註冊:2002-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-03 23:51:11 IP:218.167.xxx.xxx 未訂閱
引言: ericyang 你好: 可能你寫入資料(MAK_ID)時, 字串即已經帶空白字元. 建議看看"SET ANSI_PADDING" 的說明, 你可簡單select 字串長度以確認一下 "select datalength(MAK_ID) from Supplier".
Dear Mickey, 使用 datalength 和我用len 去查 MAK_ID 的長度, 結果是一樣的, 我在Delphi 中 Select 出來, 去看 MAK_ID資料, 存入的的確是 'C ' 但很奇怪, 我用 select MAK_ID from supplier where LEN(MAK_ID)=2 就是找不到資料, 用 select MAK_ID,LEN(MAK_ID) from Supplier length 就是為 1, 因我之前即有 test過, 所以我才敢確認是 MS SQL 將 空白忽略了,不是 Delphi 的問題,才將此問題 post 上來請教 另外我認為不能隨意去修改 user 輸入的資料, set ansi_padding 預設為 on,若改為 off, 會將後面空白清除, 在有些地方 user 可能真的需要空白 將其清除, 反而會造成新的問題
ericyang
一般會員


發表:2
回覆:8
積分:2
註冊:2002-04-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-04 00:05:18 IP:218.167.xxx.xxx 未訂閱
引言: 我猜想會不會是你MAK_ID欄位型態的問題, 如果你設定的資料型態為CHAR(2), 那麼雖然你的廠商代號只有一個character, 但實際上SQL Server會自動幫你補上一個空白,所以MAK_ID欄位真正的值其實是'C ',要解決這個問題,只要將資料型態改為varchar就可以了
Dear nancy, 這裡本來就是設 varchar(8),SQL 並不會自動補上空白,這是因user 輸入的就 是 'C ',但 Supplier 應只有 'C' 而沒有 'C ', 我要的是要能check 出 Supplier 中並沒有'C ', 而不讓此資料存入. 目前因這樣的問題,在 SQL 中 select sum(..) ... 的時候,廠商 'C' and 'C ' 的 data 是會匯總在一起, 但在有些地方,若因判斷較複雜, 無法用 SQL 指令一次做出來,我會 select 所有 data, 一筆筆在 Delphi 程式中判斷 再做分類匯總處理,這時 Delphi 中 'C' and 'C ' 就是不一樣的,造成本來一 個廠商的資料,誤認為 2 個廠商,兩邊比較, 數字勾稽不對,事實上以資料來看, 錯的是誰 ? ---> 這是 SQL Server 的問題 如何解決 ? --> 只要能能check 出Supplier 中並沒有'C ' 即可 尚請各位先進指導, 謝謝
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-04 09:45:07 IP:210.65.xxx.xxx 未訂閱
Hi ericyang,    我剛剛在 Oracle 中找了一個一百多萬筆資料的 Table進行測試,在該欄位有 Index 的狀態下,上述兩個語法效能是一樣的,並無多大差異(Range Scan,about 0.02 second with no data return),若是無 Index 則效能也是一樣(Full Scan,about 18 second with no data return),至於 SQL server 由於沒有工具,所以無法測試    另外一種寫法如下:
SELECT  *
FROM    SUPPLIER
WHERE   MAK_ID LIKE 'C '
AND     DATALENGTH(MAK_ID) = DATALENGTH('C ')
But still a little stupid !! 不知其他大大是否有根本的解決方法? ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
bennykyp
一般會員


發表:11
回覆:31
積分:8
註冊:2004-10-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-04 11:03:57 IP:218.208.xxx.xxx 未訂閱
本人觉得若要避免在 SQL 上出现两笔资料 , 最好在还没 Post Data 前 , 用 Trim(Edit.Text) 把空格去掉,对设计师来说 会省掉一些麻烦。 以上纯属个人意见!
bennykyp
一般會員


發表:11
回覆:31
積分:8
註冊:2004-10-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-04 11:11:55 IP:218.208.xxx.xxx 未訂閱
[quote] ?我覺的 , 若要避免在 SQL statement 上出現兩筆資料, 最好在還沒把 Data Post 到 Server 上時, 用 Trim(Edit1.Text) 把空格去掉. 這會幫助設計師省掉一些麻煩 以上純屬個人意見
ericyang
一般會員


發表:2
回覆:8
積分:2
註冊:2002-04-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-04 15:24:17 IP:218.167.xxx.xxx 未訂閱
引言: Hi ericyang, 我剛剛在 Oracle 中找了一個一百多萬筆資料的 Table進行測試,在該欄位有 Index 的狀態下,上述兩個語法效能是一樣的,並無多大差異(Range Scan,about 0.02 second with no data return),若是無 Index 則效能也是一樣(Full Scan,about 18 second with no data return),至於 SQL server 由於沒有工具,所以無法測試 另外一種寫法如下:
SELECT  *
FROM    SUPPLIER
WHERE   MAK_ID LIKE 'C '
AND     DATALENGTH(MAK_ID) = DATALENGTH('C ')
But still a little stupid !! 不知其他大大是否有根本的解決方法? ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ---------------------------------- < face="Verdana, Arial, Helvetica"> 謝謝 Fishman 的幫忙,此部份在程式中,此部份應只要使用下面指令即可 SELECT MAK_ID FROM SUPPLIER WHERE MAK_ID LIKE :MAK_ID 因 TEST 結果, 若 Supplier 中只有 'C' 的廠商, 若 user 輸入 'C ' ,使用 LIKE 就會找不到資料,這就是想要的結果,目前看來這 是目前比較簡單的方式,只是 5 百多支程式要修改, 真的又要花一 陣子時間, 只是還是不能相信 = 為何不是做完全比對的方式, 不知 這是 SQL 標準還是只有 MS 這樣做, 不知你在 Oracle 中 test 的結 果是否也是如此 ? 甘溫!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-04 15:46:56 IP:210.65.xxx.xxx 未訂閱
Hi ericyang,    根據我測試的結果,Oracle 中並不會有這種現象     ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
hua2000
中階會員


發表:102
回覆:200
積分:65
註冊:2006-11-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-24 15:19:05 IP:61.234.xxx.xxx 未訂閱
加一个ASCLL码可以实现的啊
系統時間:2024-11-22 16:12:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!