访问查询不一致地将空字符串视为空

时间:2016-02-24 23:39:25

标签: sql ms-access

我有一个从Access数据库中获取数据的应用程序。我正在寻找列的最小值,而我得到的结果是不一致的。

我是否遇到了一个功能,其中Access不一致地将空字符串视为空,这取决于我是否添加过滤器,或者我查询数据的方式有问题?

该列包含一个空白值(非空)和几个全部相同的非空值(大约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&#39;而不是空字符串。在此阶段,可能没有包含空字符串,因为它被视为null或过滤器将其删除。

使用过滤器返回前1个状态的第二个查询显示空字符串未被过滤掉,这意味着Min函数忽略空字符串。

获取未过滤表的最小值的第三个查询返回空字符串 - 因此最小函数不排除空字符串/将它们视为空。

第四个查询确保空字符串位置中没有空值。

我的结论是,可能包含其他表和过滤条件会导致空字符串值被视为null,但我觉得我必须遗漏一些东西。

注意:我有一个非常相似的查询(更改了日期文字),它针对导入SQL Server数据库的相同数据执行。它正确地返回&#39;&#39;对于所有4个查询。

有人知道为什么第一个查询中的Min函数会忽略空字符串吗?

PS:对于喜欢使用连接的查询的人

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

1 个答案:

答案 0 :(得分:1)

这与损坏的数据或联合或联接无关。通过在访问中执行以下查询,可以很容易地看到问题:

create table testbug(Field1 varchar(255)NULL)
插入testbug(Field1)值('a')
插入testbug(Field1)值('')
插入testbug(Field1)值('c')
从testbug中选择min(field1)

我认为这是ms-access中的一个错误。当ms-access中的MIN函数遇到一个空字符串('')时,它会忘记他遇到的所有值,并从空字符串下面的所有值返回最小值。 (在我的简单例子中只有值'c')