2

ms access データベースで使用される iif 関数でクエリを実行できるか知りたいです。私の場合

Select field1,(iif(3<4,'Select * from tbl1','select * from tbl2')) from tblmain

そのようなクエリを実行しようとすると、構文エラーに直面しています

4

1 に答える 1

3

達成しようとしていることは、サンプル クエリからは明らかではありません。

Access クエリで IIF 関数を使用できます。次に例を示します。

SELECT IIF([SomeField]<15, "Smaller than 15", "Greater than!") As Whatever 
FROM myTable

たとえば、Access でもサブセレクトを使用できます ( http://allenbrowne.com/subquery-01.htmlから恥知らずに盗まれた例)。

SELECT MeterReading.ID, MeterReading.ReadDate, MeterReading.MeterValue, 
    (SELECT TOP 1 Dupe.MeterValue                 
     FROM MeterReading AS Dupe                     
     WHERE Dupe.AddressID = MeterReading.AddressID 
         AND Dupe.ReadDate < MeterReading.ReadDate   
     ORDER BY Dupe.ReadDate DESC, Dupe.ID) AS PriorValue 
FROM MeterReading;

指定されたサブセレクト クエリは、TOP 1 を指定するか集計関数を使用して、単一のレコードを返すことが保証されている必要があり、WHERE 句で親クエリにリンクする必要があることに注意してください。

ただし、サブセレクトが有効であったとしても、質問でしようとしている方法で IIF ステートメントを使用することはできませんが、そうではありません。

ここで何を達成しようとしているのかは私にはわかりませんが、提案する2つのオプションがあります。まず、代わりに VBA で実行することを検討してください。何かのようなもの:

const query1 As String = "Select * from tbl1"
const query2 As String = "select * from tbl2"

Dim recset as DAO.Recordset
set recset = CurrentDB.OpenRecordset(iif(3<4, query1, query2))

あるいは、tbl1 と tbl2 の両方に同じフィールドがある場合は、次のようにすることもできます。

SELECT * FROM tbl1 WHERE 3<4
UNION ALL
SELECT * FROM tbl2 WHERE NOT (3<4)

3<4 をチェックしている実際の条件に置き換えると、どちらか一方またはクエリからのみレコードが返され、両方から返されることはありません。ただし、これを行う必要がある場合、データベースに設計上の問題がある可能性があるのではないかと思います。これが必要になる疑わしいシナリオがたくさんあり、有効なシナリオはほとんどないと思いますが、それらは存在すると確信しています。

于 2011-03-08T00:28:05.353 に答える