如何找到最少数量的LIKE模式以满足字符串列表

时间:2019-02-04 21:12:19

标签: sql sql-server sql-server-2014 sql-like coding-efficiency

所以可以说我在Excel文件中有以下字符串列表:

33000
33100
33010
33110
45050
45150
45250
45350
45360
45370
55360
55370

我有一个SQL表,其中包含此字符串列表以及更多字符串,我想创建一个SELECT语句,仅搜索此字符串列表。

我可以像SELECT * FROM Table WHERE field = '33100' OR field = '33010' ...这样的蛮力声明。但是,我可以使用LIKE语句来缩小WHERE列表。

我正试图找到一种方法来使LIKE语句的数量尽可能少,因此我需要生成最少数量的SQL模式来标识整个列表。对于上面的列表,最少的SQL模式是:

33[01][01]0
45[0123]50
[45]53[67]0

在输入是字符串列表的情况下,如何动态生成这样的模式列表?

2 个答案:

答案 0 :(得分:1)

另一种方法可能更“优雅”,但不会更快。您的字符串以不同的字符开头,因此like模式的第一部分将是通配符或字符范围-有效地排除了索引的使用。

另一方面,一个简单的in表达式可以使用索引:

where col in ('33100', '33010', '33110', '45050', ...)

答案 1 :(得分:1)

  1. 好的,假设您在Excel中有此数据,该数据从单元格A2开始

  2. 在单元格C1中编写以下代码:create table ##TEMP(STRS varchar(20))

  3. 在单元格C2中编写以下代码:="insert into ##TEMP"&" values"&" ('"&A2&"' )"&","

  4. 在单元格C3中编写以下代码:=" ('"&A3&"')“&”,“

  5. 现在在C3单元格中按Ctrl + C公式并将其粘贴到C4-C13范围内

enter image description here

  1. 现在您将获得像这样的Excel

enter image description here

  1. 将此代码复制到C1-C13范围中,打开SQL Management Studio粘贴它,删除最后一个逗号(在这种情况下,单元格C13中有一个逗号,您必须删除它才能成功运行SQL),然后运行您有##temp表。
  2. INNER JOIN与您的表一样

    SELECT * FROM MYTABLE M INNER JOIN ##TEMP AS T ON T.STRS = M.COLUMN_NAME_STR

您应该获得所需的数据,希望对您有所帮助。