需要其他方式编写SELECT查询

时间:2019-08-06 14:47:47

标签: sql-server

我正在尝试找到一种有助于根据条件获取记录的方法。

CREATE TABLE Student
(
    StudentId INT PRIMARY KEY IDENTITY(1,1),
    Name NVARCHAR(255),
    Email NVARCHAR(255)
)

INSERT INTO Student VALUES('James', 'james@test.com'),('Alex', 'alex@example.com'),('Jack', 'jack@test.com'),('Robby', 'robby@example.com')

问题:我需要根据变量来获取所有电子邮件地址以'%test.com'结尾的学生。

DECLARE @fetchTestDotComStudents BIT = 1

-- Now if @fetchTestDotComStudents is 1 then fetch only @test.com students else fetch all students.
-- Below is the query I used

IF(@fetchTestDotComStudents = 1)
BEGIN
    SELECT * FROM Student
    WHERE Email LIKE '%@test.com'
END
ELSE IF(@fetchTestDotComStudents = 0)
BEGIN
    SELECT * FROM Student
END

还有其他方法可以使用CASE语句代替IF-ELSE子句。这也将减少冗余。

期望找到结果的不同方法。

3 个答案:

答案 0 :(得分:1)

只需使用OR:

SELECT * FROM Student
WHERE Email LIKE '%@test.com' OR @fetchTestDotComStudents = 0

答案 1 :(得分:0)

您可以照做

SELECT * 
FROM Student
WHERE (Email LIKE '%@test.com' AND @fetchTestDotComStudents = 1)
      OR
      @fetchTestDotComStudents = 0;

答案 2 :(得分:0)

如果此表很大,并且您经常以这种方式进行搜索,则可能要考虑添加一个额外的列。以%开头的LIKE子句需要对整个表进行聚集索引扫描。您可以在Istest上放置非聚集索引,这将大大加快查询速度。如果您的桌子很小,那么这可能是矫kill过正。

CREATE TABLE Student
(
    StudentId INT PRIMARY KEY IDENTITY(1,1),
    Name NVARCHAR(255),
    Email NVARCHAR(255),
    IsTest bit
)

SELECT * FROM Student
WHERE IsTest = 1 OR Istest = @fetchTestDotComStudents   --Grabs everything if variable is 0.