Игнорировать определенные строки, если ложь - PullRequest
1 голос
/ 20 марта 2019

Я написал этот запрос, и он предназначен для отправки клиенту электронного письма с информацией в базе данных. Мне бы хотелось, чтобы он проверил любые значения, которые возвращаются как 0, а не отправлял их в @message. Я полагаю, что мне нужно заявление if, но я не смог понять, как заставить его работать. Любая помощь приветствуется.

Запрос:

select @AssignedCount = (select COUNT(*)
 FROM event
 where status_name = 'ASSIGNED' AND primary_unitid = NULL
 OR status_name = 'ASSIGNED' AND primary_unitid = '')

select @UnitResource = (select COUNT (*)
from unit_resources
where unit_seqnum NOT IN (select unit_seqnum from unit))

select @UnitEmployee = (select COUNT (*)
from unit_employees
where unit_seqnum NOT IN (select unit_seqnum from unit))

select @LoggedOff = (select COUNT(*) 
from unit 
where status_name = 'LOGGED_OFF')

select @Duplicates = (SELECT ISNULL(
(select COUNT(*)
from unit
group by unitid 
having COUNT(*) > 1), 0))


select @message =


'Status Report' +
'   Events in assigned status with no primary unit: '
+ REPLACE((str(@AssignedCount)),' ','') +

' Un-linked unit resource table rows: '
+ REPLACE((str(@UnitResource)),' ','') +

' Un-linked Unit resource table rows: '
+ REPLACE((str(@UnitEmployee)),' ','') + 

'   Units with a status of Logged Off: '
+ REPLACE((str(@LoggedOff)),' ','') +

'   Duplicate Units: '
+ REPLACE((str(@Duplicates)),' ','')`

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Вам придется использовать операторы if для динамического построения строки:

-- setting to blank; otherwise, the string would be null
set @message = ''

-- dynamically building @message with if statements
if @AssignedCount > 0
    set @message =  'Status Report' +
                    '   Events in assigned status with no primary unit: '
                    + REPLACE((str(@AssignedCount)),' ','')

if @UnitResource > 0
    set @message = @message + ' Un-linked unit resource table rows: '
                            + REPLACE((str(@UnitResource)),' ','')

if @UnitEmployee > 0
    set @message = @message + ' Un-linked Unit resource table rows: '
                            + REPLACE((str(@UnitEmployee)),' ','')

if @LoggedOff > 0
    set @message = @message + '   Units with a status of Logged Off: '
                            + REPLACE((str(@LoggedOff)),' ','')

if @Duplicates > 0
    set @message = @message + '   Duplicate Units: '
                            + REPLACE((str(@Duplicates)),' ','')

-- removing leading space from @message if AssignedCount is 0
set @message = ltrim(@message)
0 голосов
/ 20 марта 2019

Лично, на самом деле, вместо кучки IF утверждений, я бы, вероятно, пошел на что-то вроде этого и сделал бы все за один раз:

SET @message = CONCAT('Status Report',
                      (SELECT CONCAT('   Events in assigned status with no primary unit: ',COUNT(*))
                       FROM event
                       WHERE status_name = 'ASSIGNED'
                         AND primary_unitid = NULL
                          OR status_name = 'ASSIGNED'
                         AND primary_unitid = ''
                       HAVING COUNT(*) > 0),
                      ((SELECT CONCAT(' Un-linked unit resource table rows: ',COUNT (*))
                        FROM unit_resources ur
                        WHERE NOT EXISTS (SELECT 1 --I changed this from a NOT IN to an EXISTS, as NOT in have behave oddly with NULLs
                                          FROM unit u
                                          WHERE u.unit_seqnum = ur.seqnum)
                        HAVING COUNT(*) > 0))); --You get the idea now

Я здесь не все сделал, однако, HAVING COUNT(*) > 0 означает, что никакие строки (включая 0) не будут возвращены, если нет соответствующих строк. Это означает, что информация не будет объединена до значения @message.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...