这是我的选择陈述
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
答案 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周期。