ИЛИ и И в SQL возвращают результаты, которые не должны появляться

Мне нужно получить результаты, которые будут включать только заголовки, в которых появляются и обновляются следующие комбинации в течение определенного диапазона дат. Проблема в том, что приведенный ниже код по-прежнему возвращает множество других заголовков, которые не входят в условие поиска.

Результат выглядит так: ясно, что с кодом что-то не так. Желаемый результат не возвращает ни одного из этих заголовков

ИЛИ и И в SQL возвращают результаты, которые не должны появляться

USE My DB;--[dbo].[fn_StripCharacters]
;with cte_All as (
    SELECT
        --top 100
        ID,
        t.LastNameTx,
        t.FirstName,
        MyDB.[dbo].[fn_StripCharacters] (t.Title, '^a-z') as Stripped_Title,
        t.Title,
        t.City,
        t.State,
        t.VerificationDate,
        t.VerifiedBy,
        t.ModificationDate,
        t.ModifiedBy,
        'Higher Importance' AS Importance
    FROM
        My.dbo.MyTable t WITH (NOLOCK)
),
cte_TitleExceptions as (
    SELECT
        --top 100
        ID,
        t.LastNameTx,
        t.FirstName,
        MyDB.[dbo].[fn_StripCharacters] (t.Title, '^a-z') as Stripped_Title,
        t.Title,
        t.City,
        t.State,
        t.VerificationDate,
        t.VerifiedBy,
        t.ModificationDate,
        t.ModifiedBy,
        'Higher Importance' AS Importance
    FROM
        cte_All gc WITH (NOLOCK) -- ISCore.dbo.GovContact gc WITH (NOLOCK)
    WHERE
        COALESCE(CONVERT(DATE, t.VerificationDate),CONVERT(DATE, t.ModificationDate)) < DATEADD(m, -12, @DateInPast)
        AND COALESCE(CONVERT(DATE, t.VerificationDate),CONVERT(DATE, t.ModificationDate)) != CAST(GETDATE() AS DATE) --@DateInPast
        AND (
            -- list of exeptions from Williamson Remot
            --     gc.Stripped_Title LIKE '%Director%'
            gc.Stripped_Title LIKE '%Human%'
            OR gc.Stripped_Title LIKE '%HR%'
            OR gc.Stripped_Title LIKE '%ITDirector%'
            OR gc.Stripped_Title LIKE '%ITOfDirector%'
            OR gc.Stripped_Title LIKE '%DirectorIT%'
            OR gc.Stripped_Title LIKE '%DirectorOfIT%'
            OR gc.Stripped_Title LIKE '%InformationTechnolog%'
            OR gc.Stripped_Title LIKE '%Finance%'
            OR gc.Stripped_Title LIKE '%CFO%'
            OR gc.Stripped_Title LIKE '%ChiefFinancialOfficer%'
            OR gc.Stripped_Title LIKE '%FinancialOffice%'
            OR gc.Stripped_Title NOT LIKE '%Engineer%'
        )
)
select
    *
from
    cte_TitleExceptions

предоставьте образцы данных и желаемый результат

eshirvana 30.03.2021 04:37

У вас есть связка OR ... LIKE ... OR ... LIKE, а затем последние две строки - OR ... NOT LIKE ... '% Engineering%' и '% Engineer%'. Это в основном вернет все ваши другие заголовки, независимо от того, соответствуют ли они одному из «LIKE» или нет. Вы уверены, что эти двое должны быть «НЕ НРАВИТСЯ» ... или они должны находиться за пределами этого блока, в собственном «И»?

Craig 30.03.2021 04:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
26
1

Ответы 1

В ваших операциях OR есть ошибка

...
    OR gc.Stripped_Title NOT LIKE '%Engineering%'
    OR gc.Stripped_Title NOT LIKE '%Engineer%'
...

вы в основном говорите вернуть все, что не похоже на "% Engineer%", поэтому все приведенные выше инструкции будут бесполезны

если я правильно понял, ваш код должен быть таким:

...
AND (
            -- list of exeptions from Williamson Remot
            --     gc.Stripped_Title LIKE '%Director%'
            gc.Stripped_Title LIKE '%Human%'
            OR gc.Stripped_Title LIKE '%HR%'
            OR gc.Stripped_Title LIKE '%ITDirector%'
            OR gc.Stripped_Title LIKE '%ITOfDirector%'
            OR gc.Stripped_Title LIKE '%DirectorIT%'
            OR gc.Stripped_Title LIKE '%DirectorOfIT%'
            OR gc.Stripped_Title LIKE '%InformationTechnolog%'
            OR gc.Stripped_Title LIKE '%Finance%'
            OR gc.Stripped_Title LIKE '%CFO%'
            OR gc.Stripped_Title LIKE '%ChiefFinancialOfficer%'
            OR gc.Stripped_Title LIKE '%FinancialOffice%'
           
        )
AND (     
   gc.Stripped_Title NOT LIKE '%Engineer%'
 -- these two can be combined to one  
)
...

Это правильно

Craig 30.03.2021 04:45

@eshirvana Не уверен, почему я должен сказать НЕ НРАВИТСЯ Мне нужно использовать LIKE, чтобы возвращать заголовки в моем поисковом запросе

enigma6205 30.03.2021 05:01

@ enigma6205 Я ничего не говорю, вы использовали НЕ НРАВИТСЯ! см. свой код.

eshirvana 30.03.2021 05:03

Если что-то имеет Human и необходимо вернуть эту запись. Но если плитки нет в других заголовках, указанных в предложении where, мне не нужно ее возвращать.

enigma6205 30.03.2021 05:04

тогда это AND, а не OR, см. вторую часть моего ответа

eshirvana 30.03.2021 05:06

@ enigma6205 добро пожаловать, примите в качестве ответа, если это помогло

eshirvana 30.03.2021 05:16

Другие вопросы по теме