我正在尝试找到一种有助于根据条件获取记录的方法。
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子句。这也将减少冗余。
期望找到结果的不同方法。
答案 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.