访问SQL IIF Complex

时间:2011-11-16 17:23:26

标签: sql ms-access iif

我正在尝试使用iif语句将一个列数据状态更改为另一个 (即:iif([major]="eet","electronic engineering technology"))。

我得到它的工作,直到我添加一个名为PLS的组的新专业我得到一个框,表明表达式太复杂。

当我拿出那个时,它运行正常。 iif语句的访问量是否有限制?

Majors: IIf([Major]="EET","Electronics Engineering Technology",
IIf([Major]="DMA","Digital Media Arts Technology",
IIf([Major]="BAM","Business Administration - Management ",
IIf([Major]="Ess","Industrial Electronics Technology - Electronic Security Systems",
IIf([Major]="FMT","Facilities Management Technology",
IIf([Major]="FMTC","Facilities Management Technology Certificate",
IIf([Major]="HIT","Health Information Technology",
IIf([Major]="HSE","Human Services",
IIf([Major]="HVAC","Heating, Ventilation, Air Conditioning and Refrigeration Technology",
IIf([Major]="IENET","Industrial Electronics Technology - Computer and Networking Track",
IIf([Major]="Auto","Automotive Technology",
IIf([Major]="AT","Accounting Technology",
IIf([Major]="IETC","Industrial Electronics Technology-  Computer Track",
IIf([Major]="IETR","Industrial Electronics Technology - Railway Electronics Systems",
IIf([Major]="PLS","test","Ophthalmic Dispensing"))))))))))))))

6 个答案:

答案 0 :(得分:1)

一个选项是使用Switch()语句而不是IIf():

Majors: Switch([Major]="EET","Electronics Engineering Technology",
               [Major]="DMA","Digital Media Arts Technology",
               ...,
               [Major]="PLS","test",
               True, "Ophthalmic Dispensing")

<击>

虽然VBA交换机功能似乎接受了大量参数(我在停止测试之前已达到22级深度),但Jet / ACE数据库引擎的Switch实现似乎最多限制在14个级别。正如你正确指出的那样,它会扼杀15或更多。

这似乎使查找表(如下所述)成为唯一可行的选项。 (还有其他不那么实用的选项,比如编写自己的Switch()函数,它接受任意大量的参数,但我认为当查找表在这里是一个明显的选择时,这很愚蠢。)


更好的选择是创建查找表并将其加入查询。如果可以确定查找表中每个“Major”缩写都有一行,请使用INNER JOIN。如果你不能确定,请使用带有Nz()或IIf()的OUTER JOIN。

答案 1 :(得分:0)

如果您的后端位于MS SQL Server上并通过ODBC连接表,则可以在SQL代码中使用CASE WHEN THEN END CASE语句,但在MS Access中则不能。

您可能遇到的限制是SQL查询的堆栈深度限制:每个嵌套表达式都要求查询分析器更深入一步,并且在某个时间点堆栈耗尽然后失败。此外,SQL查询中的符号总数有限制,但这个数字足够大,应该可以。

可以快速克服您的解决方案(尽管它使您的查询有效地变慢)是将值放到单独的表中并使用MS Access中的DLookUp(Table, Field, Criteria)函数执行查找。或者,您可以将表格加入缩写,然后将查询转换为完整的表格(也称为物化视图)。

答案 2 :(得分:0)

我会使用像这样的查询运行VBA循环

UPDATE TableName SET Major = [LongName] WHERE Major = [ShortName]

其中[LongName]和[ShortName]是参数。

但是你真的最好不要在列中留下缩写并创建一个查找表,当你想使用长名称时可以加入。它在数据存储方面效率更高。

答案 3 :(得分:0)

创建一个两列查找表,填充IIF映射,然后加入此表。这将产生诸如引用完整性,当这些值更容易更改表而不是更改所有查询等时。

答案 4 :(得分:0)

我要做的是为每个专业创建单独的查询,然后传递iif或switch。最后,它可以帮助最终用户将数据导出到powerpoint,因为他们不必对数据进行排序。

答案 5 :(得分:0)

在达到MS Access中的开关功能限制后,我到这里结束了。万一这对我位置上的任何人都有帮助,这就是我所做的。

我在10时达到了switch的极限。对我来说,有效的方法是使用&组合两个switch语句。

Switch(CityName = "London", "English", 
              CityName = "Rome", "Italian", 
              CityName = "Paris", "French") code here
&
Switch(CityName = "New York", "English", 
              CityName = "Turin", "Italian", 
              CityName = "Bourgogne", "French")