【问题标题】:SQL Condition based searching ,not working with AND condition基于 SQL 条件的搜索,不适用于 AND 条件
【发布时间】:2020-02-23 04:48:05
【问题描述】:

我正在实现搜索操作(通过存储过程进行客户端搜索) 我有一个“Nvarchar”类型列“ArticleHeader”和一个“DATE”列“DateEffective” 我通过 @operator 执行基于条件的搜索, 对于闲置的 sn-p,我正在尝试在连词 (AND) 中搜索日期和文章标题 我没有得到任何结果,但是如果我单独运行它们,它们效果很好。

找到sn-p:

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
)
)
---------------------------------------------------------------------------

【问题讨论】:

  • 据我所知,它的工作条件单一?
  • 是的,如果您一次只运行一个,即注释掉文章标题,则日期有效。
  • 那么你需要同时执行这两个搜索参数吗?
  • 是的就是这样
  • 在这个查询运算符中对所有条件都一样吗?

标签: sql search sql-server-2017


【解决方案1】:

您好@Azhar,请您检查一下这个查询,它在两种情况下都可以正常工作。

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
)
)
---------------------------------------------------------------------------

输出

开始

【讨论】:

  • 嘿@jishan 它适用于 neq 但只要我输入 'startswith' 运算符它就不会返回结果,如果我用 OR 更改连词 (AND) 它可以工作,请看一下。
  • 肯定会检查并回复您。
  • @AzzFalconer 你能检查一下start with 你没有任何@DateEffective 相关的条件你需要通过1=1 来返回输出:)
猜你喜欢
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多