【问题标题】:Transact-SQL: How do I tokenize a string?Transact-SQL:如何标记字符串?
【发布时间】:2011-06-02 02:01:23
【问题描述】:

我希望能够对文本框中的输入字符串进行标记以进行查询。 示例:用户在文本框中输入“abc xyz 123”。 我想这样做:

SELECT * FROM database WHERE Name contains "abc" AND "xyz" AND "123"
-- as opposed to containing "abc xyz 123"
-- please ignore my sql syntax, I am an absolute beginner

谢谢。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    使用字符串拆分函数(例如,this one),您可以得到这样的结果:

    SELECT t.*
    FROM atable t
      INNER JOIN dbo.Split(@UserInput, ' ') s ON t.Name LIKE '%' + s.Data + '%'
    

    【讨论】:

      【解决方案2】:

      一种可能的解决方案是您获取字符串并将其拆分为您的标记,然后为每个标记将其插入临时表中,然后将您的临时表连接到您的搜索表并在连接中执行类似 '%' + tokenColumn + '%' 获取所有包含令牌值的行

      以下是拆分字符串的示例:http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx

      【讨论】:

        【解决方案3】:

        您可以使用动态 SQL 来实现:

        declare @InputText varchar(8000)
        set @InputText = 'abc xyz 123'
        
        declare @CommorText varchar(8000)
        set @CommorText = 'SELECT * FROM table WHERE Name like ''%' + replace(@InputText, ' ', '%'' or Name like ''%') + '%''';
        
        -- @CommorText would look like this at this point
        -- SELECT * FROM table WHERE Name like '%abc%' or Name like '%xyz%' or Name like '%123%'
        
        execute(@CommorText)
        

        [编辑]回应 Avitus 的评论:

        不是最完美的解决方案。但是,如果有人输入'drop table Test1',查询将是SELECT * FROM Test1 WHERE Name like '%drop%' or Name like '%table%' or Name like '%Test1%'

        【讨论】:

        • 是的,直到有人输入参数,例如“--drop yourDatabase”或任何其他 sql 注入攻击
        【解决方案4】:

        我也有同样的问题。我有 1,200 行字符串用空格字符分隔。我的答案是使用像 Open Office Calc 这样的电子表格。然后如果你需要把它们放在db中,你可以通过公式生成插入脚本。这不会使用 SQL,但它可能会像我一样解决您的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-13
          • 2018-09-03
          相关资源
          最近更新 更多