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'

ここでやろうとしているのは、選択ステートメントの結果をフォーマットして、

もし ('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

4

2 に答える 2

1

多くの場合、パフォーマンスの観点から、このようなことを2 つのクエリとして実行した方がよいでしょう。したがって、代わりに:

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 では、文字と数値のどちらかを自由に選択できる場合がありますが、移植性はありません。

于 2013-07-31T01:24:02.607 に答える
0

IF (B.harga > 0, ...)残念ながら、この部分は完全なクエリではなく行ごとに評価されるため、これを単一の に短縮する方法はありません。

ただし重要なことは、古いバージョンの MySQLは行ごとに 1回だけ条件を評価するため、すべての行で CPU サイクルを消費することはないということです。

于 2013-07-31T01:16:35.513 に答える