我可以在iif函数中执行查询吗?

时间:2011-03-05 19:35:11

标签: ms-access iif-function

我想知道我可以在ms access数据库中使用的iif函数中运行查询。我的情况

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

当我尝试执行类似问题的查询时,我面临语法错误

1 个答案:

答案 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,你只会从一个或另一个或查询中获取记录,而不是两者。但是,我怀疑如果你需要这样做,你的数据库可能会有设计问题 - 我可以想到许多有问题的情况需要这样做,而且很少有效,尽管我确信它们存在。