iT邦幫忙

0

在SQL SELECT句中的條件句為何用"11"?

sql
賽門 2009-08-20 13:49:3911898 瀏覽

最近, 為了瞭解公司ERP系統的問題, 用SQL Server Profiler去看ERP系統執行的過程中有那些SQL, 結果看到一些我覺得奇怪的條件句:
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE A.AAA = B.BBB AND 1<>1
問題在那個"1<>1", 我還看到有些條件句是"1=1"或"0<>0"或"0=0"或"1=0"或"1<>0"的
為何這麼寫呢? 是為了要讓一定撈到資料或一定空資料嗎?

看更多先前的討論...收起先前的討論...
總裁 iT邦好手 1 級 ‧ 2009-08-20 16:10:43 檢舉
也許只是系統的bug吧....
aqr199xx iT邦新手 5 級 ‧ 2009-08-21 09:26:57 檢舉
這個題目可以寫一篇文章了

原來這個常用的小技巧被看作是 被入侵, bug, 不入流的

要怎麼回答這個題目, 還要想想, 很難用50字內說清楚耶
pantc328 iT邦研究生 1 級 ‧ 2009-08-21 11:45:32 檢舉
小技巧??
你為何不寫成
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE 1<>1
賽門 iT邦超人 1 級 ‧ 2009-08-21 11:52:59 檢舉
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE 1<>1
沒有資料, 只有Schema
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE 1<>0
等於兩個Table outer join...
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE 1=0
也是沒有資料, 只有Schema
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE 1=1
好像是兩個Table inner join...筆數又不合..比用1<>0的筆數少

弄的腦袋成漿糊...1<>1...我還試了2<>2, 3<>3, 4<>4....真是呆到家了, 哈哈~~
又好像是惡整SQL Server...好玩...(不要K我)
外獅佬 iT邦大師 1 級 ‧ 2009-08-21 11:55:18 檢舉
我想,那些程式應該是不同人寫的...
每個人的習慣不一樣...
pantc328 iT邦研究生 1 級 ‧ 2009-08-21 12:00:34 檢舉
A.AAA = B.BBB
這個地方永遠沒意義.
我如果當驗收員.用工具掃Source Code掃到永遠執行不到的Code.或沒意義的Code.我就當成隱藏碼.管他有沒有技巧.為安全而言,先打槍再說.
這個問題問我這個偽手槍叔就對了
手槍叔曾任該ERP廠商的程式設計師
對於這種漿糊式寫法顧有心得
原因很簡單,只是利用來試通的,
但方法百百種幹麼用這種? 這問題就不用再追究的,蠻無聊的
因為您也改不了,反正有人最後決定採用這個方法
pantc328 iT邦研究生 1 級 ‧ 2009-08-31 09:42:35 檢舉
通不通,在Connection 就知道了.不用到 SQL Command 時期.
我不知道這是用什麼技術的.像我用.NET 技術.取資料跟取 Schema 做法是不同的.
外獅佬 iT邦大師 1 級 ‧ 2009-08-31 09:46:13 檢舉
是啊...不是所有程式語言都有 fillschema 這麼好用的method....
Albert iT邦高手 1 級 ‧ 2009-09-02 19:17:34 檢舉
simon581923 大師
有興趣改成 Oracle DB / PostGreSQL + java 嗎??
openSource 免費專案
賽門 iT邦超人 1 級 ‧ 2009-09-02 21:51:36 檢舉
to Albert,
抱歉, 沒興趣. 天下沒有白吃的午餐...您是眾多大型企業的專業顧問, 我們家廟太小了...
18
外獅佬
iT邦大師 1 級 ‧ 2009-08-21 10:02:29
最佳解答

早期,Visual FoxPro程式設計師,很常用到SELECT....WHERE 1=1或者1>2這種寫法
記得前輩的說法是,只要取得schema,不需要把所有資料都撈出來,效能比較好。
也不需要care資料表的變動。

賽門 iT邦超人 1 級 ‧ 2009-08-21 11:44:36 檢舉

嗯...上Google爬文, 找到不少用這樣子寫法的SQL, 應該是為了取得Schema..早期的系統可能都有這樣子的設計方式...好像都是在Delphi環境中用這樣比較多...

外獅佬 iT邦大師 1 級 ‧ 2009-08-21 11:50:39 檢舉

VFP也很多....小弟也寫過幾年的VFP....

22
bizpro
iT邦大師 1 級 ‧ 2009-08-20 14:02:20

當然是沒有資料, 所以應該是為了取得Data Schema.

看更多先前的回應...收起先前的回應...
賽門 iT邦超人 1 級 ‧ 2009-08-20 16:00:53 檢舉

取得Shema應該還有其他方式吧~~:)

bizpro iT邦大師 1 級 ‧ 2009-08-20 17:11:59 檢舉

如果schema是動態的, 這是一個簡便的取得方式.

bizpro iT邦大師 1 級 ‧ 2009-08-20 17:13:53 檢舉

你的系統是否有動態table schema的需要?

賽門 iT邦超人 1 級 ‧ 2009-08-21 09:55:52 檢舉

無法回答, 因為ERP系統是買來的, 沒有Source...但那家ERP公司也差不多在倒閉邊緣...所以也沒心力來支援什麼了..只好自己用Profiler看看到底問題出在那裏, 一看之下...問題更多...(煩...悶...)

bizpro iT邦大師 1 級 ‧ 2009-08-21 14:19:23 檢舉

不論有何理由, 這個SQL指令只會取得schema. 不會有資料. 所以取得schema是這個SQL指令的唯一結果. 但是, 這個指令只是Select, 除非是一直不斷的執行, 不然不會是你的問題. 可以少掉這個煩惱.

bizpro iT邦大師 1 級 ‧ 2009-08-28 14:59:36 檢舉

?

28
Brandon
iT邦新手 4 級 ‧ 2009-08-20 14:08:06

通常是為了寫程式方便。如果條件是變動的(也就是可以讓USER下條件查資料),SQL 的語法通常會寫成 WHERE FIELD1=VALUE1 AND FIELD2=VALUE2 AND ..., 但如果USER沒下任何條件時,SQL 就會變成 WHERE ... (後面沒任何東西),這樣會語法錯誤。所以加個 1=1 ,讓SQL 變成 WHERE 1=1. 而如果USER可以下「不等於」的條件,就用 1=0 這種寫法。說穿了就是一些小技巧而以。

看更多先前的回應...收起先前的回應...
賽門 iT邦超人 1 級 ‧ 2009-08-20 15:59:55 檢舉

你的意思是用字串執行SQL, 但因為WHERE條件中沒有任何條件為了讓SELECT句子完整被執行不會被當成錯誤, 就加上"1<>1"...以讓SELECT可順利執行...但有條件時, 也會自動加上"1<>1", 因為程式邏輯寫成這樣? 這是那個SQL程式設計老師教的?! 我覺得是在誤人子弟耶~ 恕我不客氣這麼說...

fillano iT邦超人 1 級 ‧ 2009-08-20 16:55:34 檢舉

動態生成sql語句的話,我會考慮用類似這樣的類別來操作(php啦):
http://framework.zend.com/manual/en/zend.db.select.html

不過沒有trace過,我不知道沒有下where時,他會不會塞1=1...

Brandon iT邦新手 4 級 ‧ 2009-08-20 16:56:42 檢舉

的確是沒有哪個老師會這樣教啦。很多也是從實戰中學來的技巧。當然自從有SQL INJECTION 之後,我們也不太用這種直接組SQL語法的作法了。

賽門 iT邦超人 1 級 ‧ 2009-08-21 11:37:46 檢舉

喔, OK...瞭解...

我比較偏好使用
Select
*
From [Table]
Where (1 = 1)
And [C1] = N'param'

20
pantc328
iT邦研究生 1 級 ‧ 2009-08-20 15:17:51

你被駭客攻擊了,人家用SQL Injection 了.
WHERE A.AAA = B.BBB AND 1<>1 == WHERE 1<>1
TO yohun WHERE FIELD1=VALUE1 AND FIELD2=VALUE2 如果沒有任何東西是
WHERE (FIELD1=VALUE1 AND FIELD2=VALUE2) OR (1=1)
這種怪邏輯盡量不要用.以為自己技術很高超,但漏洞一堆.

看更多先前的回應...收起先前的回應...
賽門 iT邦超人 1 級 ‧ 2009-08-20 15:56:34 檢舉

可是網管說不可能被駭, 因為, ERP在內網運作, 駭只能攻放在外部(DMZ)的Server

dylantsao iT邦研究生 5 級 ‧ 2009-08-21 09:40:02 檢舉

沒有攻不破的防火牆...要記住這一句話

小成 iT邦高手 10 級 ‧ 2009-08-22 00:08:03 檢舉

那真的只是程式技巧而已
竟然說是被駭勒= =...

一種檔SQL Injection的方法

declare @param nvarchar(50)

Select @param = N'%param%'

Select
*
From [TABLE]
Where (1 = 1)
And [Column1] = @param

6
Albert
iT邦高手 1 級 ‧ 2009-08-28 13:46:14

我們在 java 1.2 - 1.3 - 1.4 的 時候
我們的 PrepareStatement
如果是要新增一筆資料 會用 1<>1 去讀出整個 "空" Data
SELECT * FROM Invoice WHERE 1<>1
現在我們改純物件時
用的是 MInvoice invoice = new MInvoice(getCtx(), 0, get_TrxName())
我建議你有心改的話
可以用 java open source 可以看到所有 source code,
我也可以跟你技術交流一下
支持你讓你順利上線
Skype: ADempiere/Compiere

我要發表回答

立即登入回答