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