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

3
我有一个应用程序正在从Access数据库获取数据。我正在寻找一列的最小值,但是得到的结果不一致。
我是否遇到了一个特性,即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

这将返回结果为 1(当该字段与一个空字符串连接时,结果为空字符串)。 - Jamie Alford
抱歉回复晚了,因为问题只有1页多一点,我没有注意到评论。 - Jamie Alford
是的。如果我将MIN包装在LOC_STATE周围并且去掉order by,它会返回QLD。 - Jamie Alford
LOC_STATE 为空,ascii_value 返回 #Func!,data_type 返回 String。 - Jamie Alford
我在想筛选/多表是否导致空字符串被转换为null。我以前在Access和多表查询中遇到过问题。 - Jamie Alford
显示剩余6条评论
1个回答

1
这与数据损坏、工会或连接无关。通过在Access中执行以下查询,可以很容易地显示问题:
创建表testbug(Field1 varchar(255)NULL) 插入到testbug(Field1)的值为'a' 插入到testbug(Field1)的值为'' 插入到testbug(Field1)的值为'c' 从testbug中选择min(field1)
我认为这是ms-access中的一个错误。当ms-access中的MIN函数遇到空字符串('')时,它会忘记它遇到的所有值,并返回空字符串下面所有值中的最小值。(在我的简单示例中,只有值“c”)。

已确认。什么鬼? - Jamie Alford
是啊,这看起来像个 bug,不是吗? :-/ - Matthijs Jonkers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接