SQL-запрос с условным, где только иногда работает - PullRequest
1 голос
/ 02 декабря 2010

Я создаю отчет (в Crystal Reports XI) на основе хранимой процедуры SQL в базе данных.Запрос принимает несколько параметров и возвращает записи в указанном диапазоне дат.Если параметры передаются, они используются для определения того, какие записи необходимо вернуть.Если один или несколько параметров не переданы, это поле не используется для ограничения типов возвращаемых записей.Это немного сложно, поэтому вот мое предложение WHERE:

WHERE  ((Date > @start_date) AND (Date < @end_date)) 
    AND (@EmployeeID IS NULL OR emp_id = @EmployeeID) 
    AND (@ClientID IS NULL OR client_id = @ClientID)
    AND (@ProjectID IS NULL OR project_id  = @ProjectID)
    AND (@Group IS NULL OR group = @Group)

Теперь, для проблемы:

Запрос (и отчет) прекрасно работает для старых данных, в диапазоне 2000-2005.Тем не менее, предложение WHERE не фильтрует данные должным образом в течение последних лет: оно возвращает только записи, в которых параметр @Group имеет значение NULL (т. Е. Не передается).!

Ответы [ 3 ]

3 голосов
/ 12 декабря 2010

Решено!

На самом деле это никак не связано с предложением WHERE. Я позволил SQL Server создать для меня внутреннее объединение, которое должно было быть левым: многие записи последних лет не содержат записей в объединенной таблице (расходы), поэтому они не отображаются. Интересно, что несколько последних записей, в которых есть записи в таблице расходов, имеют значение NULL для группы, поэтому я получил записи только тогда, когда @Group был равен NULL.

Мораль истории: 1. Дважды проверьте все, что генерируется автоматически; и 2. Ищите значения NULL! (n8wl - спасибо за подсказку внимательно посмотреть на NULL.)

1 голос
/ 02 декабря 2010

Каковы шансы, что ваши более новые данные (после 2005 года) содержат несколько строк с NULL в emp_id, client_id, project _id или группа? Если они имеют значение NULL, они не могут соответствовать параметрам, которые вы передаете.

0 голосов
/ 02 декабря 2010

Поскольку дата и группа являются зарезервированными словами, вы можете попробовать заключить квадратные скобки вокруг полей, чтобы они не обрабатывались.Это поможет избавиться от «странных» проблем, подобных этой.Так что это сделало бы это:

WHERE  (([Date] > @start_date) AND ([Date] < @end_date)) 
AND (@EmployeeID IS NULL OR emp_id = @EmployeeID) 
AND (@ClientID IS NULL OR client_id = @ClientID)
AND (@ProjectID IS NULL OR project_id  = @ProjectID)
AND (@Group IS NULL OR [group] = @Group)
...