SQL Поиск по условию, не работает с условием AND - PullRequest
1 голос
/ 23 февраля 2020

Я выполняю операцию поиска (поиск на стороне клиента с помощью хранимой процедуры), у меня есть столбец типа Nvarchar «ArticleHeader» и столбец «DATE» «DateEffective». Я выполняю условный поиск, передавая @operator для последующего поиска Фрагмент. Я пытаюсь найти дату и заголовок статьи в Conjunction (AND). Я не получаю никаких результатов, хотя, если я запускаю их по отдельности, они работают нормально.

Найдите фрагмент:

CREATE TABLE #TempItems
(
    DateEffective DATE,
    ArticleHeader NVARCHAR(50)
)

insert into #TempItems values ('2019-12-28','Nieuws')
insert into #TempItems values ('2020-02-12','Test')
insert into #TempItems values ('2020-01-10','zolo')
insert into #TempItems values ('2020-02-23','valued')

declare @DateEffective datetime,@operator nvarchar(10)
--set @DateEffective ='2020-01-10'
set @operator='neq'
declare @ArticleHeader nvarchar (50) ='Nieuws'

select * from #TempItems PA
Where 1=1
--------------------------------------------------------------------
And
(
(
(@operator='neq') And
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE convert(date,PA.DateEffective) 
END !=
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE Convert(Date, @DateEffective)
End
)
OR
(
(@operator='eq') And
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE convert(date,PA.DateEffective) 
END =
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE Convert(Date, @DateEffective)
End
)
)
----------------------------------------------------------------------
AND
(
(lower(@Operator) = 'eq' AND 
CASE WHEN @ArticleHeader IS NULL
            THEN '1'
            ELSE PA.ArticleHeader
      END =
      CASE WHEN @ArticleHeader IS NULL
                    THEN '1'
                    ELSE CONVERT(nvarchar(1000), @ArticleHeader)
      END
)
OR
(lower(@Operator) = 'startswith' AND 
CASE WHEN @ArticleHeader IS NULL
            THEN '1'
            ELSE PA.ArticleHeader
      END Like 
      CASE WHEN @ArticleHeader IS NULL
                    THEN '1'
                    ELSE CONVERT(nvarchar(1000), @ArticleHeader) + '%'
      END
)
)
---------------------------------------------------------------------------

1 Ответ

1 голос
/ 23 февраля 2020

Привет, @Ажар, можешь проверить этот запрос, он работает нормально в обоих случаях.

DROP TABLE IF EXISTS #TempItems

CREATE TABLE #TempItems
(
    DateEffective DATE,
    ArticleHeader NVARCHAR(50)
)

insert into #TempItems values ('2019-12-28','Nieuws')
insert into #TempItems values ('2020-02-12','Test')
insert into #TempItems values ('2020-01-10','zolo')
insert into #TempItems values ('2020-02-23','valued')
insert into #TempItems values ('2020-02-24','Nieuws')

declare @DateEffective datetime,@operator nvarchar(10)
set @DateEffective ='2020-01-10'
set @operator='startswith'
declare @ArticleHeader nvarchar (50) ='Nieuws'

select * from #TempItems PA
Where 1=1
--------------------------------------------------------------------
And
(
(
(@operator='neq') And
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE convert(date,PA.DateEffective) 
END !=
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE Convert(Date, @DateEffective)
End
)
OR
(
(@operator='eq') And
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE convert(date,PA.DateEffective) 
END =
CASE WHEN @DateEffective IS NULL 
THEN '1900-1-1' 
ELSE Convert(Date, @DateEffective)
End
)
OR
(
    1=1
)
)
------------------------------------------------------------------------
AND
(
(lower(@Operator) = 'eq' AND 
CASE WHEN @ArticleHeader IS NULL
            THEN '1'
            ELSE PA.ArticleHeader
      END =
      CASE WHEN @ArticleHeader IS NULL
                    THEN '1'
                    ELSE CONVERT(nvarchar(1000), @ArticleHeader)
      END
)
OR
(lower(@Operator) = 'startswith' AND 
CASE WHEN @ArticleHeader IS NULL
            THEN '1'
            ELSE PA.ArticleHeader
      END Like 
      CASE WHEN @ArticleHeader IS NULL
                    THEN '1'
                    ELSE CONVERT(nvarchar(1000), @ArticleHeader) + '%'
      END
)
OR
(lower(@Operator) = 'neq' AND 
CASE WHEN @ArticleHeader IS NULL
            THEN '1'
            ELSE PA.ArticleHeader
      END <> 
      CASE WHEN @ArticleHeader IS NULL
                    THEN '1'
                    ELSE CONVERT(nvarchar(1000), @ArticleHeader) 
      END
)
)
---------------------------------------------------------------------------

Вывод

enter image description here

Startwith enter image description here

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