我有一个表单中的列表框,该表单由基于同一表单中的另一个控件(ctrl1)的select查询填充。它是在更新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之前,我想知道:
case
,IIf
或其他方法的论据?myfunction = the code that produces the dataset I need
来实现的吗?我想我理解如何在查询中使用该函数,只要我理解函数的输出类型即可。
提前感谢任何见解和信息。
注意:我正在使用Access 2016,但文件本身是2002-2003格式,因为这显然与我们的GIS软件兼容。
答案 0 :(得分:1)
如果控件为空(或找不到匹配项)且不需要IIF
或VBA,则有一种方法可以使Access不过滤。您需要告诉Access,如果输入为null,则只返回所有内容。您在顶部的查询将如下所示。
SELECT table1.column1, table1.column2
FROM
(SELECT table1.column1, table1.column2
FROM table1
INNER JOIN table2
ON table1.column2 = table2.column1)
INNER JOIN table3
ON table1.column2 = table3.column3
WHERE table3.column1 = [Ctrl1 input]
OR [Ctrl1 input] is null
ORDER BY table1.column2;
OR
行是什么告诉Access“你知道什么,如果我没有告诉你该怎么做就给我整个表格”。无论你的列表框是如何填充的,这段代码只关心列表框中的内容,而不关心它是如何到达的。像这样的代码可以进入Access查询的SQL视图。