代码之家  ›  专栏  ›  技术社区  ›  Raghav

根据SQL中的“名字”+“姓氏”筛选行

  •  3
  • Raghav  · 技术社区  · 15 年前

    我的数据库中有一个用户表,其中包含两列firstname和lastname。 现在在我的前端有一个文本框来过滤掉这个表中的用户。假设我以输入参数“@searchkeyword”的形式从前端获取输入。我在下面创建了一个示例:

    < PRE> >代码> 声明@测试表 ([id]int标识, [fname]nvarchar(100个), [名称]nvarchar(100) ) 插入@test(fname,lname) 选择“john”、“resig”union all 选择“dave”,“ward”union all 选择“peter”、“smith”union all 选择“Dave”、“Smith”Union All 选择“Girija”、“Acharya”Union All 选择“devendra”、“gujel”union all 选择“arjit”、“gupta” 声明@searchkeyword nvarchar(100) 从@test中选择*,其中fname+“”+lname类似于@searchkeyword < /代码>

    也就是说,到目前为止,我已经考虑过这个查询来过滤行,但它没有给出所需的结果: <代码> < PRE> 从@test中选择*,其中fname+“”+lname,如@searchkeyword

    以下是我所需的以下输入输出:

    .

    --当@searchKeyword='john resig' --所需输出:包含“john”、“resig”的行

    --当@searchKeyword='ac' --所需输出:包含“girija”、“acharya”的行

    --当@searchKeyword='smith' --所需输出:包含“peter”、“smith”和“dave”、“smith”的行

    --当@searchKeyword='g' --所需输出:包含“devendra”、“gujel”和“arjit”、“gupta”的行

    --当@searchKeyword='smith' --所需输出:包含“peter”、“smith”和“dave”、“smith”的行

    
    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
    

    以下是我所需的以下输入输出:

    --当@searchKeyword='john resig' --所需输出:包含“john”、“resig”的行

    --当@searchKeyword='ac' --所需输出:包含“girija”、“acharya”的行

    --当@searchKeyword='smith' --所需输出:包含“peter”、“smith”和“dave”、“smith”的行

    --当@searchKeyword='g' --所需输出:包含“devendra”、“gujel”和“arjit”、“gupta”的行

    --当@searchKeyword='smith' --所需输出:包含“peter”、“smith”和“dave”、“smith”的行

    6 回复  |  直到 15 年前
        1
  •  5
  •   Bob Fincheimer    15 年前

    把它们放在一起

    SELECT * FROM @Test WHERE (FName like '%' + @SEARCHKEYWORD + '%') OR (LName like '%' + @SEARCHKEYWORD + '%') OR (FName + ' ' + LName like '%' + @SEARCHKEYWORD + '%')
    
        2
  •  2
  •   Jamiec    15 年前

    好的,这个查询传递除了您想要的结果之一以外的所有结果:

    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'
    

    你也会得到约翰·雷西 G G 艾丽嘉·阿查里亚,因为崇高的原因。我的建议是允许用户选择他们的通配符作为搜索的一部分。因此,允许他们使用诸如“g*”之类的词作为搜索词来限制“g在名称的开头”。

        3
  •  1
  •   VoltaicShock    15 年前
        4
  •  0
  •   Karthik    15 年前

    像这样使用,

    @SEARCHKEYWORD='%Smith%'
    
    SELECT * FROM @Test WHERE FNAME LIKE @SEARCHKEYWORD OR LNAME LIKE @SEARCHKEYWORD
    
        5
  •  0
  •   ChrisF    15 年前

    当你使用 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”的名称。

    因此,如果要将搜索字符串作为参数传递,则需要建立 喜欢 声明:

    select * from names where forename like @SEARCHKEYWORD + '%' or
                              surname like  @SEARCHKEYWORD + '%'
    

    会在名字或姓氏所在的地方找到名字 从开始 搜索关键字

        6
  •  0
  •   Lieven Keersmaekers    15 年前

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

    这个主意是这样的

    • 创建另一个变量 @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
    
    推荐文章