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 语句,但事实并非如此。

建议有两个选项,尽管我不太清楚你在这里想要实现什么。首先,您可能要考虑改为在 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 回答