【问题标题】:Filter rows on the basis of "First Name" + "Last Name" in SQLSQL中根据“First Name”+“Last Name”过滤行
【发布时间】:2010-06-16 12:02:36
【问题描述】:

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

以下是我需要的以下输入所需的输出: <pre></pre>

--当 @SEARCHKEYWORD='John Resig' --Desired OUTPUT:包含'John','Resig'的行

--当@SEARCHKEYWORD='Ac' --Desired OUTPUT:包含'Girija','Acharya'的行

--当@SEARCHKEYWORD='Smith' --Desired OUTPUT:包含'Peter','Smith'和'Dave','Smith'的行

--当@SEARCHKEYWORD='g' --Desired OUTPUT:包含'Devendra'、'Gujel'和'Arjit'、'Gupta'的行

--当@SEARCHKEYWORD='Smith' --Desired OUTPUT:包含'Peter','Smith'和'Dave','Smith'的行

【问题讨论】:

    标签: sql search


    【解决方案1】:

    把它们放在一起

    SELECT * FROM @Test WHERE (FName like '%' + @SEARCHKEYWORD + '%') OR (LName like '%' + @SEARCHKEYWORD + '%') OR (FName + ' ' + LName like '%' + @SEARCHKEYWORD + '%')
    

    【讨论】:

      【解决方案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 ResigGirija Acharya,原因很明显。我的建议是允许用户选择他们的通配符作为搜索的一部分。因此,允许他们通过使用“g*”之类的内容作为搜索词来限制“名称开头的 g”。

      【讨论】:

        【解决方案3】:

        为什么不直接使用全文搜索

        http://msdn.microsoft.com/en-us/library/ms142571.aspx

        【讨论】:

          【解决方案4】:

          这样使用,

          @SEARCHKEYWORD='%Smith%'
          
          SELECT * FROM @Test WHERE FNAME LIKE @SEARCHKEYWORD OR LNAME LIKE @SEARCHKEYWORD
          

          【讨论】:

            【解决方案5】:

            当您使用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 + '%'
            

            将在名字或姓氏以搜索关键字开头处查找名称

            【讨论】:

            • 感谢您的回复 Chris,但我需要在单个查询中使用它,因为我将使用一个接受单个搜索关键字参数的存储过程。
            • @Raghav - 我使用硬编码字符串来说明差异。
            【解决方案6】:

            给猫剥皮的方法不止一种,但这是其中之一。

            思路是这样的

            • 创建另一个变量@LIKE_SEARCHKEYWORD 以包含massaged 输入字符串。在示例中,空格从 @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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-12-29
              • 1970-01-01
              • 2015-02-12
              • 1970-01-01
              • 2021-04-24
              • 1970-01-01
              • 2014-08-21
              相关资源
              最近更新 更多