我想知道我可以在ms access数据库中使用的iif函数中运行查询。我的情况
Select field1,(iif(3<4,'Select * from tbl1','select * from tbl2')) from tblmain
当我尝试执行类似问题的查询时,我面临语法错误
答案 0 :(得分: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;
请注意,必须保证指定的subselect查询返回单个记录 - 通过指定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,你只会从一个或另一个或查询中获取记录,而不是两者。但是,我怀疑如果你需要这样做,你的数据库可能会有设计问题 - 我可以想到许多有问题的情况需要这样做,而且很少有效,尽管我确信它们存在。