【发布时间】:2017-01-08 08:26:35
【问题描述】:
我在表单中有一个列表框,该列表框由基于同一表单中另一个控件 (ctrl1) 的选择查询填充。更新ctrl1时触发:
PARAMETERS [Ctrl1 input] Long;
SELECT table1.column1, table1.column2
FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3
WHERE (((table3.column1)=[Ctrl1 input]))
ORDER BY table1.column2;
这是基于与table3.column1 中的值匹配的表单参数,该值在table3.column3 字段中也有一个值。现在,如果表单上的选择在table3.column3 中没有匹配值,则列表框保持为空。在这种情况下,我想返回 SELECT table1.column1, table1.column2 的完整列表,而不需要所有的连接和约束。 (列表很长,所以我只想在绝对必要时使用整个东西。)
在 SQL 中,case 函数似乎可以完成我想要的,类似于以下内容:
PARAMETERS [Ctrl1 input] Long;
CASE WHEN (SELECT table3.column3 WHERE (table3.column2 = [Ctrl1 Input]) IS NOT NULL)
THEN
SELECT table1.column1, table1.column2
FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3
ELSE
SELECT table1.column1, table1.column2
但我无法在 Access 查询中使用 case。
IIf 声明似乎也可以,
PARAMETERS [Ctrl1 input] Long;
IIf(
(SELECT table3.column3 WHERE (table3.column1 = [Ctrl1 input]) IS NOT NULL),
(SELECT table1.column1, table1.column2 FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3),
(SELECT table1.column1, table1.column2)
)
但 Access 不会接受,说它需要 SELECT、INSERT、DELETE 等。另外,在测试 SELECT IIf 时,我得到的东西说它只能返回一个值,所以这对我不起作用。
所以,我已经看到在 VBA 中同时使用 case 和 IIf 并在查询中使用 THAT 的文章,但我无法找到足够清晰的示例来了解如何转换我的把自己的情况变成一个模块然后调用它。我不使用 VBA,几乎不使用 SQL。在深入研究 VBA 之前,我想知道:
- 我能用 VBA 完成我想要的吗?
-
case、IIf或其他方法是否存在论据? - 在函数中,我应该传递什么值?表单上 ctrl1 的数据?
- 我要求函数返回什么,如何返回?这是通过在函数本身中设置
myfunction = the code that produces the dataset I need来实现的吗?
我想我了解如何在查询中使用该函数,只要我了解该函数的输出类型即可。
提前感谢您提供任何见解和信息。
注意:我使用的是 Access 2016,但文件本身是 2002-2003 格式,因为这显然与我们的 GIS 软件兼容。
【问题讨论】:
-
IIF() 是正确的,您只是在错误的位置/顺序进行操作。 if 语句将在您选择的 WHERE 条件中使用,而不是之前。但就此而言,您也可以在调用 sql 之前在 VBA 中对其进行测试。老实说,您发布的代码太混乱/格式不正确,我不想尝试更多地对其进行解码,但我可以看到这至少是您的问题之一
-
@Matt 如果
FROM发生在它之前,我如何解决FROM的变化取决于IIf的结果?为混乱道歉。正如我所说,我不懂语言。如果我使用通用字段和表名会更好吗?当我查找每个函数的语法时,示例非常简单,我不知道如何调整格式,不知道一般的 SQL 方法。 -
老实说,您可能应该测试该值并使用 VBA if then 逻辑来设置查询字符串,然后传递所需的字符串。您可以在 sql 中执行此操作,但您希望左加入您的可选表,然后在 JOIN 和 WHERE 中使用 IF() 语句来说明何时满足或不满足条件。
标签: sql vba ms-access-2003