У меня есть приложение, которое захватывает данные из базы данных Access. Я ищу минимальное значение столбца, и результаты, которые я возвращаю, непоследовательны.Запрос доступа непоследовательно обрабатывает пустую строку как null
У меня есть функция, в которой 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', а не пустая строка. На этом этапе возможно, что пустая строка не включается, потому что она рассматривается как нуль или фильтр удаляет ее.
Второй запрос, который возвращает состояние верхнего 1 с использованием фильтра, показывает, что пустая строка не отфильтрована, что означает, что функция Min игнорирует пустую строку.
Третий запрос, который получает минимум нефильтрованной таблицы, возвращает пустую строку, поэтому минимальная функция не исключает пустые строки/обрабатывает их как null.
Четвертый запрос гарантирует, что в пустой позиции строки не будет нуля.
Мое заключение состоит в том, что, возможно, включение других таблиц и критериев фильтра приводит к тому, что пустое значение строки обрабатывается как нуль, но я чувствую, что мне что-то не хватает.
NB: У меня очень похожий запрос (изменение литералов даты), который выполняется против тех же данных, импортированных в базу данных 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
Это возвращает результат 1 (когда поле объединяется с пустой строкой, результатом является пустая строка) –
Извините, так долго ответило, не заметил комментарий, потому что вопрос составляет чуть более 1 страницы в длину. –
Он делает. И если я завершу MIN вокруг LOC_STATE и избавлюсь от порядка, он вернет QLD. –