2017-04-04 29 views
2

私は、Msアクセスクエリで大文字と小文字の表現を使用できないことを知りました。代わりに、IIF()関数を使用する必要があります。私は既存の古いレガシーアプリケーションのいずれかのMsアクセスクエリに変換する必要があるMS SQLクエリを持っています。私はIIF()関数の一般的な構文を知っています。しかし、私は2つのテーブルが互いに結合している複雑なケース式を持っています。あなたの誰かがここで私を助けることができますか?IIF()関数でJoinsを使用する方法とMSAccessクエリでIIF()をネストした中でselectステートメントを使用する方法は?

CASE 
    WHEN ISNULL(tblDetail.ProductDiscPct,0)<>0 THEN 'MFG' 
     WHEN EXISTS (
      SELECT 1 FROM ORDER_Shipment os 
      JOIN [ORDER_Items] oi 
      ON os.OrderId = oi.orderid 
      AND oi.MaterialId = tblDetail.MaterialID 
      AND ISNULL(oi.ItemStatusId,0)=0 
      AND oi.OrderItemTypeId = 300 
      AND [tblDetail].[Quantity] = [oi].[Qty] 
      WHERE CAST(tblInvoice.ARInvID AS varchar) = os.InvNumber 
      ) 
     THEN 'SPECIAL' 
    ELSE '' 
END AS LnNote 

これは私が代わりにそれは制御の私のドロップダウンオプションを奪った私は、次のように試みたMS-Accessクエリに変換する必要がありますが、私にどんな結果が得られなかったMS SQLクエリです - アクセスレポートのフィールドのソース。

IIf(IsNull(qryDetail.ProductDiscountPct <> 0, "MFG", "")) AS LnNote

これは私が働くのに苦労されているcase文の最初の行のみです。 qryDetailはメインクエリのサブクエリです。

+0

'IIF'をネストできませんか? – shahkalpesh

+0

@shahkalpesh:はい、私はIFFを入れ子にするのに苦労していますが、私はアクセスの初心者です。 – toofaced

答えて

0

IIFms-accessの場合はBOOLEANを返します。したがって、ISNULLがtrueであるかどうかを確認し、それが0またはそれ自身である場合はチェックしてください。その値を0と比較して確認し、MFGまたは ""を返します。

IIF(IIF(IsNull(qryDetail.ProductDiscountPct),0,qryDetail.ProductDiscountPct) <> 0,"MFG","") AS LnNote

+0

ありがとう@scsimon私はこれを試してみるつもりです。しかし、私はまだいくつかの入れ子の部分があります。すなわち 'WHEN がORDER_Shipment OSから1を選択(EXISTS [ORDER_ITEMS] OI ON os.OrderId = oi.orderid AND oi.MaterialId = tblDetail.MaterialID AND ISNULL(oi.ItemStatusId、0)= 0 AND OIをJOIN .OrderItemTypeId = 300 AND [tblDetail]。[数量] = [oi]。[数量] WHEREキャスト(tblInvoice.ARInvID AS varchar)= os.InvNumber ) ' – toofaced

+0

@サブクエリ – scsimon

+0

OK。最初は私が最後に選択したと思ったのは、サブクエリを作って、JOINステートメントの後ろにハイライト表示された – toofaced

0
IIF(Nz(tblDetail.ProductDiscPct,0) <> 0, "MFG", 
    IIF((SELECT COUNT(*) FROM ORDER_Shipment os 
    JOIN [ORDER_Items] oi 
    ON os.OrderId = oi.orderid 
    AND oi.MaterialId = tblDetail.MaterialID 
    AND ISNULL(oi.ItemStatusId,0)=0 
    AND oi.OrderItemTypeId = 300 
    AND [tblDetail].[Quantity] = [oi].[Qty] 
    WHERE CAST(tblInvoice.ARInvID AS varchar) = os.InvNumber) > 0, "SPECIAL", "") 
) AS LnNote 

これは、あなたがSQLに持っているものの、粗翻訳したものです。 さらに、EXISTSの代わりにCOUNT(*)を使用します。私はそれがクエリを遅くするようにその領域にあまりにも多くのレコードではないと仮定しています。

Nzは、ISNULLに似ています。

これは役に立ちますか?

+0

というサブクエリを作成したところです。MS-accessはIIFステートメント内のselectステートメントが気に入らなかったと思います。それは私に 'Syntax errorというエラーメッセージを投げます。クエリ式 'IIF(NX(qry .....)'。異なる方法を試しました)a)エイリアスを削除しました。 b)すべてのエイリアスに素敵な角括弧を付けます。両方とも動作しませんでした。また、私はアクセスが「JOIN」という単語を理解していないと思うので、「INNER JOIN」を使用しました。 – toofaced

+0

NxではなくNzです。構文エラーが表示されている場所は何ですか? – shahkalpesh

+0

申し訳ありませんが、私は 'Nz'を使用していましたが、それは構文エラーとして全体のselect文を強調表示していました。私はその選択部分についても「サブクエリ」を作成しようとしましたが、サブクエリに対してもエラーが出ます。 – toofaced

関連する問題