2013-07-31 70 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周期。