2015-06-22 167 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%