我的数据库中有一个用户表,其中包含两列FirstName和LastName。 现在在我的前端有一个文本框来过滤掉这个表中的用户。假设我以输入参数“@SEARCHKEYWORD”的形式从前端获取输入。我在下面创建了一个示例:
DECLARE @Test TABLE
([ID] INT IDENTITY,
[FNAME] NVARCHAR(100),
[LNAME] NVARCHAR(100)
)
INSERT INTO @Test( FNAME, LNAME )
SELECT 'John','Resig' UNION ALL
SELECT 'Dave','Ward' UNION ALL
SELECT 'Peter','Smith' UNION ALL
SELECT 'Dave','Smith' UNION ALL
SELECT 'Girija','Acharya' UNION ALL
SELECT 'Devendra', 'Gujel' UNION ALL
SELECT 'Arjit', 'Gupta'
DECLARE @SEARCHKEYWORD NVARCHAR(100)
SELECT * FROM @Test WHERE FNAME +' '+ LNAME LIKE @SEARCHKEYWORD
即。到目前为止,我已经考虑过这个查询来过滤掉行但是没有给出所需的结果:
SELECT * FROM @Test WHERE FNAME +' '+ LNAME LIKE @SEARCHKEYWORD
以下是我提到的输入所需的输出:
--WHEN @SEARCHKEYWORD='John Resig'
--Desired OUTPUT: the row which contains 'John','Resig'
--WHEN @SEARCHKEYWORD='Ac'
--Desired OUTPUT: the row which contains 'Girija','Acharya'
--WHEN @SEARCHKEYWORD='Smith'
--Desired OUTPUT: the row which contains 'Peter','Smith' and 'Dave','Smith'
--WHEN @SEARCHKEYWORD='g'
--Desired OUTPUT: the row which contains 'Devendra', 'Gujel' and 'Arjit', 'Gupta'
--WHEN @SEARCHKEYWORD='Smith'
--Desired OUTPUT: the row which contains 'Peter','Smith' and 'Dave','Smith'
答案 0 :(得分:5)
将所有这些放在一起
SELECT * FROM @Test WHERE (FName like '%' + @SEARCHKEYWORD + '%') OR (LName like '%' + @SEARCHKEYWORD + '%') OR (FName + ' ' + LName like '%' + @SEARCHKEYWORD + '%')
答案 1 :(得分:2)
好的,此查询会传递除了您想要的结果之外的所有结果:
SELECT * FROM @Test WHERE FNAME +' '+ LNAME LIKE '%' + @SEARCHKEYWORD + '%'
OR FNAME LIKE '%' + @SEARCHKEYWORD + '%' OR LNAME LIKE '%' + @SEARCHKEYWORD + '%'
失败的一个场景是
--WHEN @SEARCHKEYWORD='g' --Desired OUTPUT: the row which contains 'Devendra', 'Gujel' and 'Arjit', 'Gupta'
你也得到了John Resi g 和 G irija Acharya的高调理由。我的建议是允许用户选择他们的通配符作为搜索的一部分。因此,允许他们通过使用“g *”之类的内容来限制“g在名称的开头”作为搜索词。
答案 2 :(得分:1)
答案 3 :(得分:0)
当您使用like
时,您必须包含通配符以及搜索字词:
select * from names where forename like 'John%'
将找到以“John”开头的所有名称
select * from names where forename like '%Smith'
将找到以“Smith”结尾的所有名称
select * from names where forename like '%g%'
将找到所有名称中包含小写“g”的名称。
因此,如果您将搜索字符串作为参数传递,则需要构建like
语句:
select * from names where forename like @SEARCHKEYWORD + '%' or
surname like @SEARCHKEYWORD + '%'
将找到名称或姓氏以搜索关键字
开头的名称答案 4 :(得分:0)
像这样使用,
@SEARCHKEYWORD='%Smith%'
SELECT * FROM @Test WHERE FNAME LIKE @SEARCHKEYWORD OR LNAME LIKE @SEARCHKEYWORD
答案 5 :(得分:0)
有一种方法可以给猫皮肤,但这只是其中之一。
这个想法就像这样
@LIKE_SEARCHKEYWORD
以包含按摩输入字符串。在示例中,空格从@SEARCHKEYWORD
中删除。LIKE
语句只关心所有组合的结果。性能方面,这可能不是最好的解决方案,但确实让事情变得非常干净。如果您的输入表不是很大,那么性能损失将是可以忽略的。
SQL声明
DECLARE @LIKE_SEARCHKEYWORD NVARCHAR(100)
SET @LIKE_SEARCHKEYWORD = '%' + REPLACE(@SEARCHKEYWORD, ' ', '') + '%'
SELECT DISTINCT t.*
FROM @Test t
INNER JOIN (
SELECT ID, Name = FName FROM @Test
UNION ALL SELECT ID, LName FROM @Test
UNION ALL SELECT ID, FName + LName FROM @Test
UNION ALL SELECT ID, LName + FName FROM @Test
) n ON n.ID = t.ID
WHERE n.Name LIKE @LIKE_SEARCHKEYWORD