сравнивая нуль в сравнениях SQL - PullRequest
1 голос
/ 29 января 2011

Я создаю интерфейс с VB6, и моя база данных - Sybase.Используя DSN, я создал несколько небольших исполняемых файлов для заполнения отчетов в сетке.Это работало нормально.

Однако, если я использую приведенный ниже запрос, я получаю только час и данные с ответами.Если я выполню запрос в SQL Query, будут получены полные данные.

Я считаю, что сумма (случай, когда не будет работать в VB6, пожалуйста, укажите мне альтернативу.

"select datepart (hh, callstartdt) as Hour, " _
    & " count(seqnum) as Anaswered," _
    & " sum(case when user_id <> NULL then 1 else 0 end) as answered_calls ," _
    & " sum(case when user_id <> NULL and  datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end) , " _
    & " sum(case when user_id = NULL then 1 else 0 end), " _
    & " sum(case when user_id <> NULL and datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end)  / count(seqnum), " _
    & " sum(Case when user_id <> NULL then 1 else 0 end ) / count(seqnum) from acdcalldetail " _
    & " where callstartdt between '" & fromDt & "' and '" & toDt & "' " _
    & " and service_id not in (37,39,47,51,57,58,96,215,374,375) " _
    & " group by datepart (hh, callstartdt) " _
    & " order by datepart (hh, callstartdt)"

Ответы [ 5 ]

6 голосов
/ 29 января 2011

Вы не можете использовать when user_id <> Null.Вы должны использовать user_id Is Null или user_id Is Not Null.Если Anything = или <> для Null, то значение Unknown будет рассматриваться как ложное для выражения Case.

1 голос
/ 29 января 2011

Я предполагаю, что для sysbase это то же самое, что и для sql-сервера.

Существует настройка для переключения между (старым?) Sybase по умолчанию

set ansi_nulls off

select case when null = null then 1 else 0 end
-- returns 1

и поведением ansi.

set ansi_nulls on

select case when null = null then 1 else 0 end
-- returns 0

Сегодня вряд ли возникает вопрос, какая настройка более элегантна, но с какой настройкой возникает больше проблем.

0 голосов
/ 13 мая 2017

Точно так же вы знаете, что количество (seqnum) в качестве ответа не является правильным определением для ответа на входящие вызовы Aspect UIP.Если вы отметите поле, помеченное SwitchDispId, в нем может быть 1 или 2, что будет означать отказ от вызова.Следовательно, не отвеченный звонок.Я вижу, что вы используете user_id не нуль для получения отвеченных звонков, но я просто хотел, чтобы вы знали об этом.

Также вы можете присоединить таблицу acdcalldetail к служебной таблице, чтобы получить имена, которые больше похожи на то, чтобизнес привык видеть так:

SELECT 
     Service_c
    ,SUM(CASE WHEN acd.SwitchDispID IN (1,2) THEN 1 ELSE 0 END as Abandons
    ,SUM(CASE WHEN acd.user_id is not null THEN 1 ELSE 0 END as Answered
FROM acdcalldetail acd
JOIN service s
    ON s.service_id = acd.service_id
    AND s.sourceid = acd.sourceid
WHERE acd.CallStartDt between '20170501' AND '20170530'
AND s.Service_id NOT IN  (37,39,47,51,57,58,96,215,374,375)
GROUP BY 
    s.Service_c

"select datepart (hh, callstartdt) as Hour, " _
    & " count(seqnum) as Anaswered," _
    & " sum(case when user_id <> NULL then 1 else 0 end) as answered_calls ," _
    & " sum(case when user_id <> NULL and  datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end) , " _
    & " sum(case when user_id = NULL then 1 else 0 end), " _
    & " sum(case when user_id <> NULL and datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end)  / count(seqnum), " _
    & " sum(Case when user_id <> NULL then 1 else 0 end ) / count(seqnum) from acdcalldetail " _
    & " where callstartdt between '" & fromDt & "' and '" & toDt & "' " _
    & " and service_id not in (37,39,47,51,57,58,96,215,374,375) " _
    & " group by datepart (hh, callstartdt) " _
    & " order by datepart (hh, callstartdt)"
0 голосов
/ 14 сентября 2011

Николас, я согласен с вами в том, что сравнение с нулем всегда должно быть ложным, однако я попробовал следующий код на сервере ASE 15.0.3 и получил удивительный результат

declare @xx int
select @xx = null
select @xx
select 1 where null = @xx

Возвращается 1 длявторой выбор, который я не ожидал ..

0 голосов
/ 29 января 2011

Общее правило: любая операция с NULL приводит к NULL. Все сравнения, включающие NULL, терпят неудачу, независимо от того, является ли тест положительным ('==') или отрицательным ('<>'). Единственным исключением являются явные тесты на недействительность через IS [NOT] NULL или использование COALESCE () / ISNULL ().

...