使用SET和LIKE的SQL查询显示错误结果

时间:2018-09-21 12:00:53

标签: sql-server

| patientFirstName | patientMiddleName | patientLastName |  startdate |    enddate |

|-------------------------|---------------------------|------------------------|--------------|------------|

|          Patient |              Demo |            Test | 2018-09-02 | 2018-09-08 |

|             John |               Doe |            Demo | 2018-09-02 | 2018-09-14 |

|            Admin |             Admin |           Admin | 2018-09-07 | 2018-09-20 |

当我运行以下查询时,我期望只有一条记录,即“患者演示测试”,而不是两条记录。我在哪里弄错了?

DECLARE @searchInput varchar(10)
DECLARE @startTime DATE
DECLARE @endTime DATE
SET @searchInput = 'o'
SET @startTime = '2018-09-02'
SET @endTime = '2018-09-12'
SELECT * FROM PatientDemoTable
WHERE  (@startTime IS NULL OR startdate >= @startTime)
AND (@endTime IS NULL OR enddate <= @endTime)
AND patientFirstName like '%'+@searchInput+'%' 
OR patientMiddleName like '%'+@searchInput+'%'
OR patientLastName like '%'+@searchInput+'%'

当我删除

AND patientFirstName like '%'+@searchInput+'%' 
OR patientMiddleName like '%'+@searchInput+'%'
OR patientLastName like '%'+@searchInput+'%'

显示正确的记录,但没有文本过滤器。

http://sqlfiddle.com/#!18/db4db5/5

1 个答案:

答案 0 :(得分:3)

只需在适当的地方添加括号:

DECLARE @searchInput varchar(10)
DECLARE @startTime DATE
DECLARE @endTime DATE
SET @searchInput = 'o'
SET @startTime = '2018-09-02'
SET @endTime = '2018-09-12'
SELECT * FROM PatientDemoTable
WHERE  (@startTime IS NULL OR startdate >= @startTime)
AND (@endTime IS NULL OR enddate <= @endTime)
AND (patientFirstName like '%'+@searchInput+'%' 
OR patientMiddleName like '%'+@searchInput+'%'
OR patientLastName like '%'+@searchInput+'%')