2013-10-24 5 views
1

Я нашел несколько статей о том, как выполнить обратное тому, что я хочу сделать с помощью нескольких методов (IS NULL, CASE, COALESCE), но я думаю, что в этот момент я более смущен чем когда-либо после прочтения всего этого, и, вероятно, решение было сложнее, чем нужно. Я новичок в T-SQL, и в настоящее время я использую VS 2005 для создания основного медицинского отчета.Параметр, чтобы найти все записи или исключить NULL

У меня есть параметр Диапазон дат, который работает правильно, используя команду convert, чтобы игнорировать метку времени, дающую мне все записи для диапазона дней или дат. Теперь я хочу фильтровать SSRS-ретрансляцию по предварительной дате отчета, чтобы найти записи с предварительным отчетом или все записи в таблице.

  • База данных содержит NULL, если не предварительный отчет не был создан
  • База данных содержит метку времени, если предварительный отчет был создан. (с указанием даты и времени создания)

Мне нужно найти все записи не NULL, а все записи. (с использованием параметра)

У меня есть параметр «Показывать только предварительные отчеты?». @PrelimOnly с ответом ДА или НЕТ.

Если я использую следующий будет правильно показать все записи (все записи не NULL показаны только записи с Prelim отчет/штамп времени по настоящее время)

LIS_Results.Prelim_Report_Date <> '@PrelimOnly' ----User selects YES it passes NULL 

однако, если пользователь выбирает NO, как бы я получить его для отображения всех записей, включая NULL?

Спасибо за любую помощь

Благодарим вас за вашу помощь, это было в конечном счете, комбинация обоих, что получили это происходит. Синтаксис следующий.

WHERE (@PrelimOnly = 'NO') AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND @ReportEndDate) OR (LIS_Results.Prelim_Report_Date IS NOT NULL) AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND @ReportEndDate) 
+0

Только отзыв о датах. Вместо того, чтобы удалять временные части путем преобразования в varchar (10), это необходимо быстрее. «SELECT DATEADD (dd, (DATEDIFF (dd, 0, t.DateTimeColumn)), 0) FROM Table t;" Он вычисляет количество дней с года 0 до даты и добавляет это значение к дате 0. Все типы даты и времени. –

ответ

0

Это была комбинация Ииии и Яна, которая дала мне решение, однако синтаксис не был полным и выглядит следующим образом.

WHERE (@PrelimOnly = 'NO') AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) 
BETWEEN @ReportStartDate AND @ReportEndDate) OR (LIS_Results.Prelim_Report_Date IS NOT NULL) 
AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND 
@ReportEndDate) 

Это requeired даты и времени, чтобы быть В параметре повторяется, так что обоим этим будет по-прежнему работать, и @PrelimOnly = «NO» должен был быть первым.

0

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

Если не выбрано записей из таблицы, где условия истинны, а поле даты не равно нулю.

0

здесь есть небольшой трюк:

((LIS_Results.Prelim_Report_Date <> '@PrelimOnly') OR ([email protected])) 

, если пользователь выбрал NO - установить AllowNull аргумент 1, другой способ установить его в 0

ПРИМЕЧАНИЕ: AllowNull - это пользовательский дополнительный аргумент, вы должны добавить точно так же, как @PrelimOnly

другой возможный подход:

((LIS_Results.Prelim_Report_Date <> '@PrelimOnly') OR ('NO'='@PrelimOnly')) 

для вас полный запрос, вы должны сделать так:

WHERE 
(CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN ReportStartDate AND ReportEndDate) AND 
(
    LIS_Results.Prelim_Report_Date is not null 
    or 
    ('@PrelimOnly' = 'NO') // if instead of NO VS sends empty string replace it here 
) 
+0

В вашем первом примере пользователь должен ответить на два вопроса? (Я хочу убедиться, что я понимаю ПРИМЕЧАНИЕ: Часть) В вашем втором примере, что ('' = '@ PrelimOnly') делает с условным утверждением? Отвечает ли пользователь «НЕТ», а параметр передает 1, например, оператор условного выражения будет говорить <> 1 ИЛИ? – user2917574

+0

Пользователь должен ответить на 1 вопрос, остальная часть логики находится в вашем коде. Во втором примере - если PrelimOnly пустая строка - она ​​вернет все остальное, она вернет все записи, где дата отчета не равна значению prelim –

+0

VS 2005 продолжает менять его на это. Параметр отправляет NULL или Blank ... В любом случае я получаю одинаковый вывод, все результаты, где LIS_Resuls.Prelim_Report_Date <> «NULL» -----------> ГДЕ (КОНВЕРТ (VARCHAR (10), LIS_Results. Final_Report_Date, 101) МЕЖДУ ReportStartDate AND ReportEndDate) И (LIS_Results.Prelim_Report_Date NOT LIKE '@PrelimOnly') ИЛИ (CONVERT (VARCHAR (10), LIS_Results.Final_Report_Date, 101) МЕЖДУ ReportStartDate AND ReportEndDate) AND ('' = '@PrelimOnly') – user2917574

0

Поскольку @PrelimOnly может быть только ДА или NO, использование:

SELECT 
... 
FROM 
... 
WHERE @PrelimOnly = 'NO' or LIS_Results.Prelim_Report_Date is not null 
... 

Если параметр NO, левый состояние руки OR выполняется, и все строки возвращаются, в противном случае возвращаются только те ненулевые строки, что требуется.

+0

@PrelimOnly = 'NO' в начале был частью решения. Спасибо за помощь! – user2917574

+0

Добро пожаловать! Если ответ поможет решить вашу проблему, рассмотрите вопрос о его принятии: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

+0

Позволит ли я задать два ответа на принятые ? На самом деле это была комбинация вашего ответа, и IIya, который дал мне ответ, который мне нужен ... и даже тогда синтаксис, представленный в обоих ответах, не был полным решением. – user2917574

Смежные вопросы