有什么方法可以在T-SQL中简化这个LIKE通配符表达式,而无需求助于CLR?

时间:2009-11-19 05:14:56

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

我有一列数据库名称,如下所示:

    testdb_20091118_124925 
    testdb_20091119_144925 
    testdb_20091119_145925
    ect...

是否有一种更优雅的方式只返回类似的记录,然后使用这样的表达式:

select * from sys.databases where name 
LIKE 'testdb[_][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][_][0-9][0-9][0-9][0-9][0-9][0-9]'

2 个答案:

答案 0 :(得分:2)

不,没有“优雅”的解决方案,我很害怕。

此外,在WHERE子句中引入函数,无论是“native”还是CLR,都会阻止SQL使用索引来解析谓词(它必须扫描整个表,除非某些其他谓词来帮助,部分)

需要注意的一些事项:

  • 这里可以接受使用下划线,因为目标值似乎遵循非常规则的模式。但是,当与LIKE一起使用时,下划线本身就是一个通配符(对应于一个且恰好是一个字符)。如果你真的想要指定下划线,可以将它们放在方括号中“转义”它们,例如'abc[_]def'将匹配'abc_def',而不是'abcXdef'
  • 使用
  • 这样的表达可以使表达更具选择性和更短
    'testdb_20[0-9][0-9][0-1][0-9][0-3][0-9][_][0-9][0-9][0-9][0-9][0-9][0-9]'

即。假设日期将在本世纪,限制日期大于3倍等。

答案 1 :(得分:0)

不,这是不可能的。

顺便说一句,你需要将下划线放在括号内,因为它意味着任何字符。