【问题标题】:SQL Multiple LIKE StatementsSQL 多个 LIKE 语句
【发布时间】:2015-06-22 08:57:57
【问题描述】:

我目前正在编写一份报告,其中显示了我们销售团队涵盖的所有邮政编码。

每个团队涵盖 100 多个邮政编码。我想做的是创建一个报告,将客户带回邮政编码中。目前,我的代码如下所示。

SELECT * FROM tbl_ClientFile
 WHERE CLNTPOST1 LIKE ('B79%')
  OR CLNTPOST1 LIKE ('BB1%')
  OR CLNTPOST1 LIKE ('BB10%')
  OR CLNTPOST1 LIKE ('BB11%')
  OR CLNTPOST1 LIKE ('BB12%')
  OR CLNTPOST1 LIKE ('BB18%')
  OR CLNTPOST1 LIKE ('BB2%')
  OR CLNTPOST1 LIKE ('BB3%')
  OR CLNTPOST1 LIKE ('BB4%')
  OR CLNTPOST1 LIKE ('BB5%')
  OR CLNTPOST1 LIKE ('BB6%')
  OR CLNTPOST1 LIKE ('BB8%')
  OR CLNTPOST1 LIKE ('BB9%')
  OR CLNTPOST1 LIKE ('BB94%')
  OR CLNTPOST1 LIKE ('BD1%')
  OR CLNTPOST1 LIKE ('BD10%')
  OR CLNTPOST1 LIKE ('BD11%')
  OR CLNTPOST1 LIKE ('BD12%')
  OR CLNTPOST1 LIKE ('BD13%')
  OR CLNTPOST1 LIKE ('BD14%')
  OR CLNTPOST1 LIKE ('BD15%')
  OR CLNTPOST1 LIKE ('BD16%')
  OR CLNTPOST1 LIKE ('BD17%')
  OR CLNTPOST1 LIKE ('BD18%')
  OR CLNTPOST1 LIKE ('BD19%')
  OR CLNTPOST1 LIKE ('BD2%')
  OR CLNTPOST1 LIKE ('BD20%')
  OR CLNTPOST1 LIKE ('BD21%')
  OR CLNTPOST1 LIKE ('BD22%')
  OR CLNTPOST1 LIKE ('BD3%')
  OR CLNTPOST1 LIKE ('BD4%')
  OR CLNTPOST1 LIKE ('BD5%')
  OR CLNTPOST1 LIKE ('BD6%')

我希望有一种更快、更简单的方法来做到这一点。任何建议将不胜感激。有没有办法为每个销售团队创建一个变量,例如@SalesTeam1 = SELECT * FROM tbl_ClientFile WHERE POSTCODE1 like '' or like ''

真的只是在寻找想法。干杯

【问题讨论】:

  • 为什么不使用一个表格来关联团队及其邮政编码?然后,您可以通过简单的内部连接来解决这个问题。
  • @Luaan +1,但看起来,我会选择 Town 表和 Team_Town 关系表:看起来,甚至没有 Town 表。
  • 我确实考虑过为此创建一个表,然后进行内部连接。问题是团队是动态的,他们不断地改变他们所覆盖的领域。因此,他们可能会在一周内覆盖德文郡,然后在下周覆盖斯温顿的所有邮政编码。
  • 请注意,您的条件有很多冗余...例如。 BD10% 到 BD19% 被条件 BD1% 覆盖
  • 那么你应该建立一个有2列TownPostCode的表,或者如果适用,可以添加Country

标签: sql sql-server tsql variables sql-like


【解决方案1】:

与 CTE 作为 ( 选择值 从 ( 值 ('B79'), ('BB1'), ('BB10'), ('BB11'), ('BB12'), ('BB18'), ('BB2'), ('BB3'), ( 'BB4'), ('BB5'), ('BB6'), ('BB8'), ('BB9'), ('BB94'), ('BD1'), ('BD10'), ('BD11 '), ('BD12'), ('BD13'), ('BD14'), ('BD15'), ('BD16'), ('BD17'), ('BD18'), ('BD19'), ('BD2'), ('BD20'), ('BD21'), (' BD22'), ('BD3'), ('BD4'), ('BD5'), ('BD6') ) V(值) )

选择 * FROM tbl_ClientFile T 存在的位置(从 CTE 中选择 TOP 1 1,其中 T.CLNTPOST1 LIKE CTE.VALUE + '%')

【讨论】:

    【解决方案2】:

    您的大多数赞已被其他赞覆盖。您可以像这样使用具有多个值的喜欢并获得相同的结果:

    SELECT * FROM tbl_ClientFile
    WHERE 
      CLNTPOST1 LIKE ('B79%')
      OR CLNTPOST1 LIKE ('BB[12345689]%')
      OR CLNTPOST1 LIKE ('BD[1-6]%')
    

    如果您检查 CLNTPOST1 类似于 BB1%,那么您不必检查 BB11% 或 BB12%

    【讨论】:

      【解决方案3】:

      一种可能的解决方案。创建一个表Prefix(v varchar(4)),在其中插入这些值。那么解决方案是:

      SELECT * 
      FROM tbl_ClientFile cf
      JOIN Prefix p on cf.CLNTPOST1 LIKE p.v + '%'
      

      如果某个前缀包含另一个前缀,例如BB1BB10BB15...,则排除重复项:

      SELECT DISTINCT cf.* 
      FROM tbl_ClientFile cf
      JOIN Prefix p on cf.CLNTPOST1 LIKE p.v + '%'
      

      【讨论】:

      • 联接将创建 2 个表的乘积,这将返回不需要的重复行。应该在 where 条件下使用 EXISTS()
      • @eric,你真的认为CLNTPOST1 可以同时从BD14BB10 开始吗?如果我在前缀的两边都使用%,那将是真的......
      • 假设BB10 可以匹配BB1%BB10%,其中BB10 是有效的邮政编码。
      • 我什至没有看到,感谢您发现它。所以我会得到基于 OR CLNTPOST1 LIKE ('BD1%') OR CLNTPOST1 LIKE ('BD10%') 的重复项,它将带回 BD1% 以及之后的任何内容和 BD10%
      • @Eric,是的,这是正确的。但我认为如果它们匹配并显示适当的前缀,它应该匹配这些前缀。
      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多