代码之家  ›  专栏  ›  技术社区  ›  Anders Abel

字符串结尾通配符匹配的索引

  •  3
  • Anders Abel  · 技术社区  · 15 年前

    我有一个电话号码表,将电话号码存储为varchar(20)。我需要对两个整数进行搜索,但也只对数字的最后一部分进行搜索,因此典型的查询将是:

    SELECT * FROM PhoneNumbers WHERE Number LIKE '%1234'
    

    如何在 Number 使这些搜索高效的列?有没有一种方法可以创建索引来对 颠倒的 字符串?另一种选择可能是在存储之前反转数字,这将提供如下查询:

    SELECT * FROM PhoneNumbers WHERE ReverseNumber LIKE '4321%'
    

    但是,这将要求数据库的所有用户始终反转字符串。它可以通过存储正常数字和反转数字以及通过插入/更新时的触发器更新反转数字来解决。但这种解决方案并不十分优雅。

    还有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Quassnoi    15 年前
    ALTER TABLE phonenumbers ADD reverse_number AS REVERSE(number) PERSISTED
    
    CREATE INDEX ix_phonenumbers_reversenumber ON phonenumbers (reverse_number)
    
    SELECT  *
    FROM    phonenumbers
    WHERE   reverse_number LIKE '4321%'
    
        2
  •  2
  •   Alex K.    15 年前

    您不需要让用户反转,除非他们手动执行查询,并且您可以使用计算列而不是触发器:

    CREATE TABLE TBL (TEL VARCHAR(20) NOT NULL)
    ALTER TABLE TBL ADD TEL_REV AS REVERSE(TEL)
    CREATE NONCLUSTERED INDEX IX_REVERSETEL ON TBL (TEL_REV) INCLUDE (TEL)
    
    INSERT TBL SELECT '12345678'
        UNION SELECT '147258369'
        UNION SELECT '963852741'
    
    --find nums ending in 5678
    SELECT * FROM TBL WHERE TEL_REV LIKE REVERSE('5678') + '%' /*index seek*/