2015-06-22 85 views
4

我目前正在撰写一份报告,向我展示我们的销售团队所涵盖的所有职位代码。SQL多个LIKE语句

每个团队涵盖超过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 ''

只是为了创意而钓鱼。欢呼声

+3

为什么不只是有一张关联团队和他们的邮政编码的表格?然后你可以用一个简单的内连接来解决这个问题。 – Luaan

+0

@Luaan +1,但是看起来,我会选择一个'Town'表和一个'Team_Town'关系表:因为看起来,甚至没有'Town'表。 –

+0

我的确想过为此创建一个表格,然后进行内部连接。问题在于团队活跃,他们不断地改变他们所覆盖的领域。因此,在一周内,他们可能会覆盖德文郡,然后在下周他们会覆盖斯温顿的所有邮政编码。 – RustyHamster

回答

1

 
WITH CTE AS 
(
SELECT VALUE 
FROM (
     VALUES ('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(VALUE) 
)

SELECT * FROM tbl_ClientFile T WHERE EXISTS (SELECT TOP 1 1 FROM CTE WHERE T.CLNTPOST1 LIKE CTE.VALUE + '%')

4

可能的解决方案之一。创建一个表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 + '%' 
+1

连接将创建2个表的产品,这将返回不需要的重复行。应该使用'EXISTS()'在条件为 – Eric

+0

@eric,你真的认为'CLNTPOST1'可以从'BD14'和'BB10'同时开始吗?如果我在前缀的两边使用'%',这是事实.... –

+1

假设它可以匹配BB1%和BB10%,其中BB10是一个有效的邮政编码。 – Eric

1

最喜欢的是已被其他喜欢覆盖。您可以使用多个值喜欢这样,并得到相同的结果:

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

如果您检查CLNTPOST1就像BB1%,那么你就不必检查BB11%以上BB12%