【问题标题】:Searching set of characters in a string搜索字符串中的字符集
【发布时间】:2012-12-07 23:08:52
【问题描述】:

如何查询我是否要检查字符串是否包含数字(字符),例如 1,2,3,4,5,6,7 的任何顺序。可以通过在 LIKE 子句中为数字 1,2 编写 AND 语句来实现,如下所示,

Where days like '%1%' and days like '%2%' ...... So on

是否有任何查询可以检查字符串中存在的特定字符。或者上面的例子如何通过简写查询来实现。请帮忙。谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql sql-server-2005


    【解决方案1】:

    一种方法是创建一个包含您想要搜索的所有字符串的表。

    例如

    DECLARE  @searchstr TABLE (s VARCHAR(10))
    INSERT INTO @searchstr VALUES ('1'),('2'),('3'),('4'),('5'),('6'),('7')
    
    DECLARE  @tbl TABLE (days VARCHAR(100))
    INSERT INTO @tbl VALUES ('1234567'),('123'),('1122334'),('7654321')  
    
    SELECT   t.days 
    FROM @tbl t
    LEFT JOIN  @searchstr s 
            ON t.days LIKE '%' + s.s+ '%'
    GROUP BY t.days HAVING COUNT(DISTINCT s.s) = 7
    

    【讨论】:

      【解决方案2】:

      CONTAINS() 不适合你吗?

      还要注意如何split word into char array

      【讨论】:

      • @eraj 会的,但问题是,您必须使用全文索引才能使用此谓词。
      • @eraj:如果您为此使用全文,则需要从停止列表中删除这些字母,否则它将只搜索单词而不是字母......而且全文搜索也不可取我想你的要求..
      【解决方案3】:

      我建议调查[PATINDEX][1]。来自 MSDN:

      返回模式第一次出现的起始位置 一个指定的表达式,如果没有找到该模式,则为零 有效的文本和字符数据类型。

      你可能最终会使用WHERE PATINDEX(%[0-9]%', foo) > 0之类的东西

      【讨论】:

      • 当字符串中的任何字符与表达式匹配时,PATINDEX 返回 true。但我需要字符串中存在的所有这些字符(1234567)。
      • 然后我误读了这个问题。如果不使用一堆 AND 语句,不确定这是否可行:(
      【解决方案4】:

      你可以使用 CHARINDEX

      CHARINDEX(stringthatcontainschars1, '1', numofpositiontostartlookingat)
      Output: 24, the position that your searched for char is at. returns zero if not found
      

      如果您要在列或字符串中查找数字 1,您会输入:

      CHARINDEX(columnname, '1', 1)
      This would search for '1' beginning at position 1.
      

      您可以根据它是否返回 0 来执行条件语句来确定 char 是否在字符串中,然后编写您需要的任何代码。

      【讨论】:

        【解决方案5】:

        我会使用 isnumeric 来确保它们都是数字,然后测试 0、8 或 9 而不是 1-7,因为它更短。

        【讨论】:

          【解决方案6】:

          如果日期以逗号分隔,您可以使用FIND_IN_SET

          SELECT FIND_IN_SET(1, days) AND FIND_IN_SET(2, days);
          

          这是不同的,不是更好,但据我所知,没有其他原生方式。 而且 LIKE 可能会比 find_in_set 快得多

          【讨论】:

            猜你喜欢
            • 2010-11-28
            • 1970-01-01
            • 2016-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多