在SQL中根据“名字”+“姓氏”过滤行

时间:2010-06-16 12:02:37

标签: sql search

我的数据库中有一个用户表,其中包含两列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'

6 个答案:

答案 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中删除。
  • 创建内部联接,检索firstname-lastname的所有可能组合。
  • 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