2009-07-02 25 views
31

因爲我認爲這應該是一個基本問題,我知道這個問題可能已被問到,但我無法找到它。我可能要獲得我的同行壓力徽章,但我仍然會問:在IN內使用通配符的SQL Server

有沒有在SQL Server中使用IN時不知道使用通配符%的方法。

我意識到,我可以使用OR的一樣:

select * 
from jobdetails 
where job_no like '0711%' or job_no like '0712%' 

,並在某些情況下,我可以像使用子查詢:

select * 
from jobdetails 
where job_no in (select job_no from jobs where job_id = 39) 

,但我希望做類似如下:

select * 
from jobdetails 
where job_no in ('0711%', '0712%') 

在這種情況下,它使用百分號作爲字符而不是通配符,因此沒有r ows返回。我現在只需要使用一堆OR,但我知道必須有更好的方法。你用什麼方法呢?

回答

19

如何:

WHERE LEFT(job_no, 4) IN ('0711', '0712', ...) 
+4

我很欣賞你的回答,雖然這是行得通的,但這可能是由於我的例子簡化了。我想要一些不一定依賴前4個字符的東西。我正在尋找更多依賴通配符的東西。不過謝謝。 – Dusty 2009-07-02 19:13:00

+1

這似乎是迄今爲止最好的答案,至少在我的情況下。這將匹配從列表中的指定文本開始的任何值,並且使添加條目變得更加容易(我需要100個條目的列表,因此大多數其他解決方案都太冗長) – 2012-04-04 15:32:33

5

你可以嘗試這樣的事:

select * 
from jobdetails 
where job_no like '071[12]%' 

你問不完全是,但它具有相同的效果,而且是靈活的在其他方面也:)

+0

這非常接近我的尋找。可以將引號之間的值擴展爲多個值(例如'071 [10,22]%'),您是否有詳細解釋這一點的鏈接? – Dusty 2009-07-02 20:27:28

+1

@Dusty:不會,'071 [10,22]%將匹配任何字符串'071x%,其中x是1 0或2中的一個。不尋找071,然後是10或22.請參見模板部分:http://msdn.microsoft.com/en-us/library/ms179859.aspx – 2009-07-02 21:13:01

+0

+1雖然這不是我正在尋找,但它是密切和有益的。雖然它可能與我所尋找的最接近,但我不能確切地將其標記爲答案。謝謝 – Dusty 2009-07-02 21:39:27

3
SELECT c.* FROM(
SELECT '071235' AS token UNION ALL SELECT '07113' 
UNION ALL SELECT '071343' 
UNION ALL SELECT '0713SA' 
UNION ALL SELECT '071443') AS c 
JOIN (
SELECT '0712%' AS pattern UNION ALL SELECT '0711%' 
UNION ALL SELECT '071343') AS d 
ON c.token LIKE d.pattern 

071235 
07113 
071343 
1

IN運營商不過是 '=' C的花哨OR omparisons。事實上,在SQL 2000中,由於IN被擴展爲OR,在列表中包含大約10K條目(是的,有人在寫入10k條目...)時,SQL 2000中存在堆棧溢出錯誤。所以你不能在其中使用任何通配符匹配。

-1

你有問題的答案就在那裏。使用IN時不能直接傳遞通配符。但是,您可以使用子查詢。

試試這個:

select * 
from jobdetails 
where job_no in (
select job_no 
from jobdetails 
where job_no like '0711%' or job_no like '0712%') 
) 

我知道這看起來瘋狂,因爲你能堅持使用或您的WHERE子句。爲什麼子查詢?如果必須匹配來自不同源的細節,子查詢方法將非常有用。

拉傑

10

這樣的事情呢?

declare @search table 
(
    searchString varchar(10) 
) 

-- add whatever criteria you want... 
insert into @search select '0711%' union select '0712%' 

select j.* 
from jobdetails j 
    join @search s on j.job_no like s.searchString 
0

在Access SQL中,我會使用這個。我想象SQLserver具有相同的語法。

SELECT * 從jobdetails 其中類似 「0711 *」 或job_no job_no像 「0712 *」

-2

試試這個

select * 
from jobdetails 
where job_no between '0711' and '0713' 

唯一的問題是,job '0713'將要以及返回 所以可以使用'07299999999999'或只加and job_no <> '0713'

丹扎米爾

9

我想我有一個解決方案,這個調查的創始人想要以簡單的形式。它適用於我,實際上這是我來這裏開始的原因。我相信只要在'%text%'這一欄旁邊加上括號就可以和OR結合使用。

select * from tableName 
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or 
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%') 
2
  1. 我首先增加了一個關靜電工作臺與我的通配符的所有可能結果 (該公司擁有4個字符的nvarchar的代碼作爲其地區,他們通配符的當地人) 即它們可能有456?這將給他們456 [1]至456 [Z]即0-9 & A-Z

  2. 我必須編寫一個腳本來拉動當前用戶(聲明他們)併爲聲明的用戶拉出掩碼。

  3. 創建一些臨時表只是基本的人通過每個結果排名的行號此當前用戶

  4. 環路(您還是這樣或那樣的等等)

  5. 插入測試表。

這裏是我使用的腳本:

Drop Table #UserMasks 
Drop Table #TESTUserMasks 

Create Table #TESTUserMasks (
    [User] [Int] NOT NULL, 
    [Mask] [Nvarchar](10) NOT NULL) 

Create Table #UserMasks (
    [RN] [Int] NOT NULL, 
    [Mask] [Nvarchar](10) NOT NULL) 

DECLARE @User INT 
SET @User = 74054 

Insert Into #UserMasks 
select ROW_NUMBER() OVER (PARTITION BY ProntoUserID ORDER BY Id DESC) AS RN, 
     REPLACE(mask,'?','') Mask 
from dbo.Access_Masks 
where prontouserid = @User 

DECLARE @TopFlag INT 
SET @TopFlag = 1 

WHILE (@TopFlag <=(select COUNT(*) from #UserMasks)) 
BEGIN 
    Insert Into #TestUserMasks 
    select (@User),Code from dbo.MaskArrayLookupTable 
    where code like (select Mask + '%' from #UserMasks Where RN = @TopFlag) 

    SET @TopFlag = @TopFlag + 1 
END 
GO 

select * from #TESTUserMasks 
3

我也有類似的目標 - 來到該解決方案:

select * 
from jobdetails as JD 
where not exists (select code from table_of_codes as TC 
         where JD.job_no like TC.code) 

我假設你的各種代碼(」 0711%','0712%'等),包括%,都存儲在一個表中,我打電話給* table_of_codes *,其中的字段爲,代碼爲

如果%未存儲在代碼表中,則只需連接'%'。例如:

select * 
from jobdetails as JD 
where not exists (select code from table_of_codes as TC 
         where JD.job_no like concat(TC.code, '%')) 

據我所知,concat()函數可能因具體數據庫而異。

我希望它有幫助。我適應它:

http://us.generation-nt.com/answer/subquery-wildcards-help-199505721.html

-2

這可能我是最簡單的解決方案使用like any

select * 
from jobdetails 
where job_no like any ('0711%', '0712%') 

在Teradata數據能正常工作。

0

正如傑里米史密斯發佈的那樣,我會回顧一下,因爲我無法回答他的這個特定問題。

select * 
from jobdetails 
where job_no like '071[1-2]%' 

如果你只需要0711%0712%你也可以把括號內的範圍。對於NOT關鍵字,你也可以使用[^1-2]%