2016-02-24 1 views
3

У меня есть приложение, которое захватывает данные из базы данных 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 
+0

Это возвращает результат 1 (когда поле объединяется с пустой строкой, результатом является пустая строка) –

+0

Извините, так долго ответило, не заметил комментарий, потому что вопрос составляет чуть более 1 страницы в длину. –

+0

Он делает. И если я завершу MIN вокруг LOC_STATE и избавлюсь от порядка, он вернет QLD. –

ответ

1

Это не имеет ничего общего с коррумпированными данными или союзами или присоединяется. Проблема может быть легко сделана видимым exectuting следующих запросов доступа:

создать таблицу testbug (Field1 VARCHAR (255) NULL)
вставки в testbug (Field1) значение ('а')
вставки в testbug (Field1) значения ('')
вставки в testbug (Field1) значения ('с')
выберите мин (field1) от testbug

на мой взгляд, это ошибка в MS-Access.Когда функция MIN в ms-доступе попадает в пустую строку (''), она забывает все значения, которые он встретил, и возвращает минимальное значение из всех значений ниже пустой строки. (в моем простом примере только значение «c»)

+0

Подтвердили. WTF? –

+0

Да, это похоже на ошибку или что? : - / –