Sql Access查询不一致地将空字符串视为null

Sql Access查询不一致地将空字符串视为null,sql,ms-access,Sql,Ms Access,我有一个从Access数据库获取数据的应用程序。我在寻找列的最小值,得到的结果不一致 我是否遇到过Access不一致地将空字符串视为null的特性,这取决于我是否添加了筛选器,或者我查询数据的方式是否有问题 该列包含一个非空值NOTNULL和几个非空值,这些值在大约30个“QLD”实例中完全相同。我使用的查询有一个包含多个其他表的过滤器,因此只有空白值和大约一半的“QLD”值是合格的。 显示代码和效果可能比描述代码更容易。我创建了一系列联合查询,这些查询“应该”返回相同的结果,但不会返回相同的结

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

我是否遇到过Access不一致地将空字符串视为null的特性,这取决于我是否添加了筛选器,或者我查询数据的方式是否有问题

该列包含一个非空值NOTNULL和几个非空值,这些值在大约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)
如果我对过滤器执行最小值,它将返回'QLD',而不是空字符串。在此阶段,可能不包括空字符串,因为它被视为null或筛选器将其删除

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

第三个查询获取未筛选表的最小值,返回空字符串-因此最小值函数不排除空字符串/将其视为null

第四个查询确保空字符串位置不存在null

我的结论是,可能是由于包含了其他表和筛选条件,导致空字符串值被视为null,但我觉得我肯定遗漏了什么

注意:我修改了一个非常相似的查询日期文本,它针对导入到SQL Server数据库中的相同数据执行。它正确返回所有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

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

创建表testbug Field1 varchar 255 NULL 在testbug字段1中插入值“a” 在testbug字段1中插入值 在testbug字段1中插入值“c” 从testbug中选择minfield1


我认为这是ms access中的一个bug。当ms access中的MIN函数遇到空字符串时,它会忘记遇到的所有值,并从空字符串下面的所有值返回最小值。在我的简单示例中,仅值“c”

当字段与空字符串连接时,返回的结果为1。结果为空字符串。抱歉,回复时间太长,没有注意到注释,因为问题的长度刚刚超过1页。确实如此。如果我将MIN包装在LOC_状态周围,并去掉order by,它将返回QLD。LOC_状态为空,ascii_值返回Func!“从位置选择Asc”上下文返回的数据类型返回了无效的系统调用。已确认。WTF?是的,这看起来像虫子还是什么-/
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