2009-03-16 20 views
3

以前この関数を書いたことがありますが、覚えていないようで、バージョン管理には反映されませんでした。さて、睡眠不足は何か他のものよりも、私はそれを再構築する方法を覚えていない。SQL外部結合関数

ここにそのアイデアがあります。私は "regPrice"と "custPrice"という2つのテーブルを共有キー "itemID"で持っています。彼らは両方とも "価格"の列を持ち、custPriceにはcustPriceに価格が存在する場合はその値を返すような別のキー "acct"もあります。 custPriceエントリがない場合は、regPriceを返す必要があります。

擬似コード:

if(select custPrice where acct = passedAcct and itemID = passedItemID) { 
    return custPrice; 
else 
    return regPrice; 

任意の助けいただければ幸いです。

答えて

6
SELECT COALESCE(c.price, r.price) AS price 
FROM regPrice r LEFT OUTER JOIN custPrice c 
ON (r.itemID = c.itemID AND c.acct = ?) 
WHERE r.itemID = ?; 
+0

を求めSQLサーバ - がよさそうだような音。それをストアドプロシージャにするには、次のようにします。CREATE PROCEDURE(I_itemID INT、I_acct INT)SELECT COALESCE(c.price、r.price)AS価格 regPriceからLEFT OUTER JOIN custPrice c ON(r.itemID = c.itemIDおよびc.acct = I_acct) どこr.itemID = I_itemID; これが正しいですか? – Drew

+0

はい、手順は正常に動作します。 –

1

NULLを使用していない限り、COALESCE関数を調べます。この場合は、CASEを使用します。

+0

彼はmysqlの –

2
select r.itemID, r.Acct, 
case when c.price is null then r.price else c.price end as price 
from regPrice r 
left outer join custPrice c 
on r.itemID = c.itemID 
and r.Acct = @passedAcct 
where r.itemID = @passedItemID 
+0

CASEまたはCOALESCEのパフォーマンスに違いはありますか? – Drew

+0

いいえ、ありません。 –

関連する問題