我有一个应用程序正在从Access数据库获取数据。我正在寻找一列的最小值,但是得到的结果不一致。
我是否遇到了一个特性,即Access在处理空字符串时根据是否添加过滤器而不一致地将其视为空值,还是我的查询数据方式有问题?
该列包含一个空值(非null)和几个所有相同的非空值(约30个“QLD”实例)。我使用的查询具有涉及多个其他表的过滤器,因此只有空值和大约一半的“QLD”值是合格的。
可能更容易展示代码和效果而不是描述它。我创建了一系列联合查询,这些查询“应该”带回相同的结果,但实际上并没有。
查询:
如果我在筛选器中输入最低值,它会返回“QLD”,而不是空字符串。此时可能是因为空字符串被视为null或筛选器将其删除而未包括它。
第二个查询使用筛选器获取顶部1个状态,并显示空字符串未被过滤掉,这意味着Min函数忽略了空字符串。
第三个查询从未经筛选的表格中获取最小值,返回空字符串 - 因此最小函数不会排除空字符串/将其视为null。
第四个查询确保空字符串位置没有null。
我的结论是,也许其他表格和筛选条件的包含导致空字符串值被视为null,但我感觉我可能遗漏了什么。
注:我有一个非常相似的查询(修改日期字面量),对同一数据导入到SQL Server数据库中执行。它正确地返回所有4个查询的''。
有谁知道为什么第一个查询中Min函数忽略空字符串吗?
附言:如果您喜欢带连接的查询
我是否遇到了一个特性,即Access在处理空字符串时根据是否添加过滤器而不一致地将其视为空值,还是我的查询数据方式有问题?
该列包含一个空值(非null)和几个所有相同的非空值(约30个“QLD”实例)。我使用的查询具有涉及多个其他表的过滤器,因此只有空值和大约一半的“QLD”值是合格的。
可能更容易展示代码和效果而不是描述它。我创建了一系列联合查询,这些查询“应该”带回相同的结果,但实际上并没有。
查询:
SELECT 'min(LOC_STATE)' as Category
, min(LOC_STATE) as Result
FROM pay_run, pay_run_employee, employee, department, location
WHERE pr_id = pre_prid
AND em_location = loc_id
AND pre_empnum = em_empnum
AND em_department = dm_id
AND pr_date >= #2/24/2015#
AND pr_date <= #2/24/2016#
UNION ALL
(SELECT TOP 1 'top 1 LOC_STATE'
, LOC_STATE
FROM pay_run, pay_run_employee, employee, department, location
WHERE pr_id = pre_prid
AND em_location = loc_id
AND pre_empnum = em_empnum
AND em_department = dm_id
AND pr_date >= #2/24/2015#
AND pr_date <= #2/24/2016#
ORDER BY LOC_STATE)
UNION ALL
SELECT 'min unfiltered', min(loc_state)
FROM location
UNION ALL
(SELECT TOP 1 'iif is null', iif(loc_state is null, 'a', loc_state)
FROM location
ORDER BY loc_state)
结果:
Category Result
min(LOC_STATE) 'QLD'
top 1 LOC_STATE ''
min unfiltered ''
iif is null ''
如果我在筛选器中输入最低值,它会返回“QLD”,而不是空字符串。此时可能是因为空字符串被视为null或筛选器将其删除而未包括它。
第二个查询使用筛选器获取顶部1个状态,并显示空字符串未被过滤掉,这意味着Min函数忽略了空字符串。
第三个查询从未经筛选的表格中获取最小值,返回空字符串 - 因此最小函数不会排除空字符串/将其视为null。
第四个查询确保空字符串位置没有null。
我的结论是,也许其他表格和筛选条件的包含导致空字符串值被视为null,但我感觉我可能遗漏了什么。
注:我有一个非常相似的查询(修改日期字面量),对同一数据导入到SQL Server数据库中执行。它正确地返回所有4个查询的''。
有谁知道为什么第一个查询中Min函数忽略空字符串吗?
附言:如果您喜欢带连接的查询
SELECT 'min(LOC_STATE)' as Category
, min(LOC_STATE) as Result
FROM (((pay_run
INNER JOIN pay_run_employee ON pay_run.pr_id = pay_run_employee.pre_prid)
INNER JOIN employee ON pay_run_employee.pre_empnum = employee.em_empnum)
INNER JOIN department ON employee.em_department = department.dm_id)
INNER JOIN location on employee.em_location = location.loc_id
WHERE
PR_DATE >= #2/24/2015# and
PR_DATE <= #2/24/2016#
union all
(SELECT TOP 1 'TOP 1 LOC_STATE'
, LOC_STATE
FROM (((pay_run
INNER JOIN pay_run_employee ON pay_run.pr_id = pay_run_employee.pre_prid)
INNER JOIN employee ON pay_run_employee.pre_empnum = employee.em_empnum)
INNER JOIN department ON employee.em_department = department.dm_id)
INNER JOIN location on employee.em_location = location.loc_id
WHERE
PR_DATE >= #2/24/2015# and
PR_DATE <= #2/24/2016#
order by LOC_STATE)
union all
select 'min unfiltered', min(loc_state)
from location