在一个select语句中重复if

时间:2013-07-31 01:11:41

标签: mysql

这是我的选择陈述

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语句的结果,以便

if('B.harga> 0')

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

否则

all these three column will be empty

select语句工作正常,但我只是想知道是否有办法简化IF语句,这样我就不必为每一列重复它。

顺便说一下

* :Kadar = Rates,Kuantiti = Quantity,Harga = Price

2 个答案:

答案 0 :(得分: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可以让您在字符和数值之间进行选择而不受惩罚,但这不是可移植的。

答案 1 :(得分:0)

不幸的是,没有办法将其缩短为单个IF (B.harga > 0, ...),因为这部分是按行计算的,而不是整个查询。

重要的是,任何非古老版本的MySQL都会评估每行的条件,因此您不会在每一行上烧掉CPU周期。