isnull with AND: -Выражение не булева типа, указанное в контексте, где ожидается условие, рядом с 'и' - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать isnull с оператором AND

SELECT * 
FROM   contacts AS cont 
       LEFT JOIN contactphones AS contPhone 
              ON cont.contactid = contPhone.contactid 
       LEFT JOIN sys_phonetypedesc AS phont 
              ON phont.typeid = contPhone.phonetype 
       LEFT JOIN salutations AS tsal 
              ON tsal.salutid = cont.salutation 
WHERE  cont.contactid = '29' 
       AND ( Isnull(phont.typedesc, 1) ) 
       AND ( Isnull(contPhone.phonenum, 1) ) 
ORDER  BY phont.typedesc 

но получил следующую ошибку

Выражение не булева типа, указанное в контексте, где ожидается состояние, около 'и'.

Я также пытался использовать case case

    SELECT    * 
FROM      contacts      AS cont 
LEFT JOIN contactphones AS contphone 
ON        cont.contactid = contphone.contactid 
LEFT JOIN sys_phonetypedesc AS phont 
ON        phont.typeid = contphone.phonetype 
LEFT JOIN salutations AS tsal 
ON        tsal.salutid = cont.salutation 
WHERE     cont.contactid = '29' 
AND       ( 
                    CASE 
                              WHEN phont.typedesc = NULL THEN 1 
                              ELSE phont.typedesc 
                    END as a)

но это не работает. Я ищу логику ifnull в MSSQL, но не в том случае, если она работает неправильно

пожалуйста, предложите

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Я не думаю, что вам нужно использовать ISNULL() здесь, вместо этого вы ищете IS NULL / IS NOT NULL. Сначала давайте посмотрим, почему вы получаете это сообщение об ошибке

Выражение не-логического типа, указанное в контексте, где ожидается условие, рядом с 'и'.

Вы получаете эту ошибку, потому что ( Isnull(phont.typedesc, 1) ) не является логическим выражением, и это то, что нужно предложению WHERE (True или False).

Например: предположим, phont НЕДЕЙСТВИТЕЛЕН, тогда ISNULL() вернет 1, поэтому вы пишете cont.contactid = '29' AND 1 AND ....

  • Что мне делать, чтобы получить эту ошибку?

Просто сделайте булево выражение как Isnull(phont.typedesc, 1) = 1 или как хотите вместо =1, возможно, и другое, потому что не ясно, что вам нужно проверять.

Теперь использование ISNULL(), как я вижу, указывает меньше, потому что возможные случаи, которые я вижу, выглядят следующим образом:

  • Isnull(phont.typedesc, 1) = 1, затем напрямую phont IS NULL.
  • Isnull(phont.typedesc, 1) <> 1, затем напрямую phont IS NOT NULL.
  • Isnull(phont.typedesc, 1) = AnyValue, тогда почему бы не указать phont = value или phont IN(<Values>), если вы ищете более 1 значения.
0 голосов
/ 09 января 2019
select * from contacts as cont left join ContactPhones as contPhone on cont.ContactID=contPhone.ContactID 
left join SYS_PhoneTypeDesc as phont on 
phont.TypeID = contPhone.PhoneType 
left join SALUTATIONS as tsal on tsal.salutid = cont.Salutation where cont.ContactID = '29' and (isnull(phont.TypeDesc,1))=check what u want here  
and (isnull(contPhone.PhoneNum,1))=check what u want here enter code here
order by 
phont.TypeDesc
0 голосов
/ 09 января 2019

Isnull(contPhone.phonenum,1) вернет 1, когда ваше значение contPhone.phonenum будет равно нулю, иначе оно вернет значение этого столбца, но дело в том, что вы получили ошибку, потому что вы не использовали какое-либо значение сравнения, так как в результате возникла ошибка Ваше состояние будет как ниже

          Where contactId=29 and isnull(phonenum,1)= // any value
0 голосов
/ 09 января 2019

Вы не сравниваете результат isnull ни с чем в предложении where.

(isnull(phont.TypeDesc,1))

дает вам либо TypeDesc, либо, если он нулевой, дает вам 1, но затем вы переходите непосредственно к оператору AND. Другими словами, если все соответствующие поля имеют нулевое значение, вы пытаетесь сделать следующее:

where cont.ContactID = '29' and 1 and 1

У вас либо островок не в том месте (если вы хотите увидеть его в выбранных вами полях), либо вы забыли сравнить его с чем-то.

Если вы хотите выбрать строки, в которых эти поля фактически равны нулю, то вам нужно:

where cont.ContactID = '29' 
and phont.TypeDesc is null
and contPhone.PhoneNum is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...