2013-07-31 94 views
0

這裏是我的select語句重複如果一個select語句

SELECT A.id, A.id_item, A.id_header, 

IF (B.harga > 0, B.harga,'') AS kadar, 
IF (B.harga > 0, A.kuantiti,'') AS kuantiti, 
IF (B.harga > 0, B.harga * A.kuantiti,'') AS harga 

FROM undi_bq A, jkh_item B WHERE A.id_item = B.id AND A.id_header = '0' 

我想要做的是在這裏我想從我的select語句結果的格式,使

如果('B.價格> 0' )

i will show value for columns 'kadar','kuantiti' and 'harga' 

別的

all these three column will be empty 

select語句工作正常,但我只是想知道是否有一種方法來簡化IF語句,以便我不必爲每列重複它。

*的方式:卡達爾=價格,Kuantiti =數量,價格=價格

+1

由於PHP在這裏不相關,你可以編輯你的文章到_僅僅是裸露的SQL嗎?您將獲得SQL語法突出顯示的好處,而且我們不必在頭腦中解析PHP。 –

+0

對不起,先生,我在這裏混淆,你是什麼意思與PHP,我想我已經把我的問題標記爲MySQL ...可能是我做錯了..幫我在這裏。 –

+0

我指的是代碼中無關的'$ ssql。= ...'。這就是PHP代碼,與問題無關(這個問題只涉及PHP字符串中包含的SQL),所以PHP對我們來說主要只是噪聲,這干擾了我們對SQL的視覺理解。 –

回答

1

從性能的角度來看,你通常會更好地做這樣的事情,如兩個查詢,聯合在一起。因此,而不是:

select xyzzy        as xyzzy, 
    if (harga > 0, harga, '')   as kadar, 
    if (harga > 0, kuantiti,'')   as kuantiti, 
    if (harga > 0, harga * kuantiti, '') as harga 

可以改爲做:

select xyzzy   as xyzzy, 
    harga   as kadar, 
    kuantiti   as kuantiti, 
    harga * kuantiti as harga 
    where harga > 0 
union all 
select xyzzy   as xyzzy, 
    ''    as kadar, 
    ''    as kuantiti, 
    ''    as harga 
    where harga <= 0 

這帶來了很大的性能提升,你不是在做每行的功能,這東西很少很好地擴展。在大多數系統中,後者將大大優於前者(假設你有一個harga索引,因此它可以更快地找到記錄)。

雖然,您應該實際測試兩者對真實數據的性能。我最喜歡的優化口頭禪是衡量,不要猜測。

另請注意,更傳統的DBMS'要求union(或if)中的類型相同。 MySQL可能讓你在不受懲罰的情況下在字符和數字值之間進行選擇,但這不會是可移植的。

+0

好的,謝謝,讓我試試這個第一.. –

+0

嗨@paxdiablo,有沒有辦法我只能爲卡達爾,kuantiti和harga工會不是整個select語句,否則它將會退出冗長..可能會使其成爲主查詢的子查詢...我嘗試過,但仍然無法獲得正確的語法 –

+0

@ m.zam,不幸的是。聯合基本上應該是當前查詢的兩個副本,唯一的區別在於每個行中的行的選擇(添加'where'子句選擇'>/<= 0',以及選擇實數列/計算vs'' ''DBA通常並不擔心SQL語句本身的大小,因爲它只寫入_once,而_run_很多次。 – paxdiablo

0

不幸的是,有沒有辦法縮短這個到一個IF (B.harga > 0, ...),因爲這部分是每行評估,而不是完整的查詢。

什麼是重要的是,任何非古代版本的MySQL將評估條件每行只有一次,所以你沒有在每行上燒CPU週期。