0

这是我的选择声明

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'

我在这里要做的是我想格式化我的选择语句的结果,以便

if ('B.harga > 0')

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

别的

all these three column will be empty

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

*顺便说一句:Kadar = 价格,Kuantiti = 数量,Harga = 价格

4

2 回答 2

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 要求 a union(或if)中的类型相同。MySQL 可以让您在字符和数值之间进行选择而不受惩罚,但这不会是可移植的。

于 2013-07-31T01:24:02.607 回答
0

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

但重要的是,任何非古代版本的 MySQL 只会对每行评估一次条件,因此您不会在每一行上消耗 CPU 周期。

于 2013-07-31T01:16:35.513 回答