全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6093
推到 Plurk!
推到 Facebook!

where 1=2 是什麼意思?與 where 1=1差別在那?

尚未結案
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-11 09:50:45 IP:203.69.xxx.xxx 未訂閱
例 s := 'select sum(TAX) as COSTADJ, NSN from PO_BYINVD ' ' where 1=2 ' ' group by NSN'; 1: where 1=2 是什麼意思?與 where 1=1差別在那, 2:什麼情況要用 as 另一個 table 或另一變數 (如 as COSTADJ)
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-11 10:10:15 IP:61.218.xxx.xxx 未訂閱
建議妳,問資料庫相關問題時,可以先說明妳所使用的資料庫系統是何者,以利回覆正確可用    1、where 1=2 沒有意義吧,它應是會傳回布林值 True/ Fase    0=2,1=2 條件不成立,當然是False 所以不會顯示資料(讓查詢沒有資料)    0=0,1=1 條件成立,當然是True 所以資料會顯示(讓查詢正常顯示)         2、as 是指定別名,當妳的查詢輸出時若要改變顯示的欄位名稱時用之 或是用了 sum / count / max ... 的函數,也給該欄位一個有意義的名稱     發表人 - ddy 於 2003/04/11 10:16:06
chih
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-11 10:23:35 IP:211.74.xxx.xxx 未訂閱
如前面DDY大大所述..我另外補充一下.. where 1=1的用法可以用在組SQL語法.. 我們通常是這樣寫..SELECT * FROM A,B,C WHERE A.A=B.A AND A.A=C.A 在提供查詢的時候常會遇到需要判斷到底是要用'WHERE'或者'AND' (查詢,Join)條件. 這時候先加上這一句'where 1=1',接下來你所有的join 都直接用'AND' (查詢,Join)條件,比較方便..僅供參考...
Ethan
版主


發表:101
回覆:170
積分:78
註冊:2006-07-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-11 10:31:07 IP:61.218.xxx.xxx 未訂閱
where 1=2, 此1應該是table name. 而2應該是數值的table型態,如int,float,double... 如果是字串型態就必須要 where 1='2', 而 sum(TAX) as COSTADJ應該是要去統計 COSTADJ這個table裡 的 TAX欄位加總. 有錯誤請指正一下, 謝謝!
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-11 10:41:50 IP:211.23.xxx.xxx 未訂閱
依我所知~~ WHERE 1=1 指的是TABLE內的第一個欄位有沒有等於第一個欄位的樣子 不曉得對不對~~~嘻~~~ -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-11 11:00:07 IP:211.21.xxx.xxx 未訂閱
引言: 例 s := 'select sum(TAX) as COSTADJ, NSN from PO_BYINVD ' ' where 1=2 ' ' group by NSN'; 1: where 1=2 是什麼意思?與 where 1=1差別在那,
依您的程式看來,應該是為了避免後面的條件成立時會加上and造成的錯誤,例如:您可能根據輸入條件資料的TEdit會資料有無動態的加入SQL的條件式,程式可能會這樣寫:
var
  WhereString: String;
if Edit1.Text <> '' then
  WhereString = 'Field_Name=' Edit1.Text;
if Edit2.Text <> '' then
  WhereString = ' and Field_Name=' Edit2.Text;
s := 'select sum(TAX) as COSTADJ, NSN from PO_BYINVD '  
          ' where '   WhereString;直接加上條件式,無1=2的方式
          ' group by NSN';
假設一個情況,若Edit1為空時,Edit2不為空時,此時Where後面就真接加上and而造成錯誤,若改成這樣就不會有錯
var
  WhereString: String;
if Edit1.Text <> '' then
  WhereString = ' and Field_Name=' Edit1.Text;
if Edit2.Text <> '' then
  WhereString = ' and Field_Name=' Edit2.Text;
s := 'select sum(TAX) as COSTADJ, NSN from PO_BYINVD '  
          ' where 1=2'   WhereString;
          ' group by NSN';
如此寫就不怕有and的錯誤。 所以在您的程式中1=2只是多一個條件式即不顯示任何資料,1=1顯示全部資料。 當然1=2及1=1有特殊的用法,您可以比較下面兩個SQL語法的差異:
    Select *
From TableName
Where (FieldName = 'abc' or 1 = 2)
此時便會找出TableName中的FieldName等於abc,也就是代表條件成立
==================================================================
Select *
From TableName
Where (FieldName = 'abc' or 1 = 1)
此時便會找出TableName中所有資料,也就是代表條件不成立
引言: 2:什麼情況要用 as 另一個 table 或另一變數 (如 as COSTADJ)
as的意思是給一個別名,也就是另一個名字,最常用的情況就是使用函數時會給一個別名,因為當您使用sum(TAX)是若沒有給別名,系統會內定給一個無意義名稱。所以我們希望給一個有意義的名稱使用as的方式。 ~小弟淺見,參考看看~ 發表人 - channel 於 2003/04/11 11:20:42
------
~小弟淺見,參考看看~
Mickey
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-11 11:10:14 IP:61.219.xxx.xxx 未訂閱
引言: where 1=2, 此1應該是table name. 而2應該是數值的table型態,如int,float,double... 如果是字串型態就必須要 where 1='2', 而 sum(TAX) as COSTADJ應該是要去統計 COSTADJ這個table裡 的 TAX欄位加總. 有錯誤請指正一下, 謝謝!
據我所知,沒有一家資料庫可以用數字當 >< face="Verdana, Arial, Helvetica">引言: 依我所知~~ WHERE 1=1 指的是TABLE內的第一個欄位有沒有等於第一個欄位的樣子 不曉得對不對~~~嘻~~~ 不曉得你從哪裡知道的, 只能說想像力粉不錯. <>< face="Verdana, Arial, Helvetica">引言: 如前面DDY大大所述..我另外補充一下.. where 1=1的用法可以用在組SQL語法.. 我們通常是這樣寫..SELECT * FROM A,B,C WHERE A.A=B.A AND A.A=C.A 在提供查詢的時候常會遇到需要判斷到底是要用'WHERE'或者'AND' +(查詢,Join)條件. 這時候先加上這一句'where 1=1',接下來你所有的join 都直接用'AND' +(查詢,Join)條件,比較方便..僅供參考... 再補充, 如果 where 條件接下來是 'OR' 就不能這樣用. 可能會的到非預期的結果. 資料庫種類繁多, 記得先說用啥資料庫喔 發表人 - Mickey 於 2003/04/11 11:14:53
chih
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-11 11:32:14 IP:211.74.xxx.xxx 未訂閱
Where 1=1 真的只是像DDY及Mickey所言,當成Boolean值而已,至於應用上大家可以想像一下Try看看..
timhuang
尊榮會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-11 12:50:09 IP:211.76.xxx.xxx 未訂閱
引言:
引言: 依我所知~~ WHERE 1=1 指的是TABLE內的第一個欄位有沒有等於第一個欄位的樣子 不曉得對不對~~~嘻~~~
不曉得你從哪裡知道的, 只能說想像力粉不錯. < face="Verdana, Arial, Helvetica"> 這種 column 的指定法僅適用於部分資料庫, 而且是 order by 子句使用的, where 下是不能這樣用的啦...
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-11 13:42:28 IP:61.218.xxx.xxx 未訂閱
綜合上述,再補充如下: where 1=2 為了取得Data Struct(欄位名稱) 而不要有任何資料 where 1=1 為了連接and 方便, 本身無作用 (感謝 ccchen 版主指導) < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217"> 發表人 - ddy 於 2003/04/11 13:45:36
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-13 02:20:03 IP:211.21.xxx.xxx 未訂閱
插個花: 正如ddy先進所說where 1=2 只是為了取得空的資料,其他像where 1 <> 1 也是一樣的道理, 小弟常常拿來當Temp Table使用, 在程式中DataSet開一個空的資料, 只有欄位, 都沒有值, 可讓我們依需要下去填.另外關於動態SQL小弟不才的舉兩個例子
where 1 = 1的例子
SQL.Add('Select * from Table1 ');
SQL.Add('where 1 = 1 ');
if Edit1.Text <> '' then
   SQL.Add('  and Field1 = ''' Edit1.Text ''' ');
if Edit2.Text <> '' then
   SQL.Add('  and Field2 = ''' Edit2.Text ''' ');    where 1 <> 1 or 1 = 2的例子
SQL.Add('Select * from Table1 ');
SQL.Add('where 1 <> 1 ');
if Edit1.Text <> '' then
   SQL.Add('  or Field1 = ''' Edit1.Text ''' ');
if Edit2.Text <> '' then
   SQL.Add('  or Field1 = ''' Edit2.Text ''' ');    要注意的是小弟在InterBase上面曾使用過where 1=2  或 where 1<>1 
結果資料量大時回傳速度很慢, 還不如直接找一個有Index的欄位給他不可能的值來的快
例如 where MyField1 = -999999  //MyField1 指一個有Index的欄位
不曉得不同資料庫是否有差異, 不太建議使用 1 = 2 或 1 <> 1
以上若有錯誤請各位先進不吝賜教
我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2003/04/13 02:21:47 發表人 - miles 於 2003/04/13 02:22:44
------


我不是高手, 高手是正在銀幕前微笑的人.
系統時間:2024-07-03 2:32:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!