請教SQL 查詢 where 的問題 |
尚未結案
|
ericyang
一般會員 發表:2 回覆:8 積分:2 註冊:2002-04-16 發送簡訊給我 |
我有一供應商 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 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
nancy
一般會員 發表:8 回覆:19 積分:10 註冊:2002-07-11 發送簡訊給我 |
|
ericyang
一般會員 發表:2 回覆:8 積分:2 註冊:2002-04-16 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 我猜想會不會是你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 發送簡訊給我 |
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 發送簡訊給我 |
|
bennykyp
一般會員 發表:11 回覆:31 積分:8 註冊:2004-10-21 發送簡訊給我 |
|
ericyang
一般會員 發表:2 回覆:8 積分:2 註冊:2002-04-16 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
hua2000
中階會員 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |