簡體   English   中英

SQL中使用IN中的通配符

[英]SQL Server using wildcard within IN

因為我認為這應該是一個基本問題,我知道這個問題可能已被提出,但我無法找到它。 我可能要獲得我的同伴壓力徽章,但無論如何我都會問:

在使用IN時,在SQL Server中是否有一種我不知道使用通配符%的方法。

我意識到我可以使用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%')

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

怎么樣:

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

這樣的事怎么樣?

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

我想我可以用簡單的形式解決這個調查的創始人想要的問題。 它適用於我,實際上這就是我在這里開始的原因。 我相信只需在列中使用括號,如'%text%'和OR一起使用它就可以了。

select * from tableName
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or 
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%') 

你可以嘗試這樣的事情:

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

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

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

我有一個類似的目標 - 來到這個解決方案:

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

  1. 我首先添加了一個靜態表,其中包含我的通配符結果的所有可能性(該公司有4個字符的nvarchar代碼作為他們的地方,他們通配他們的當地人),即他們可能有456? 這會給他們456 [1]到456 [Z],即0-9和az

  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

IN運算符只不過是'='比較的奇特OR 實際上它只是“沒什么,只是”在SQL 2000中,當列表包含大約10k個條目時,由於IN擴展為OR而存在堆棧溢出錯誤(是的,有人寫入10k IN條目......)。 所以你不能在其中使用任何通配符匹配。

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

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

如果您只需要0711%0712%您也可以在括號內放置一個范圍。 對於NOT關鍵字,您還可以使用[^1-2]%

在Access SQL中,我會使用它。 我認為SQLserver具有相同的語法。

select * from jobdetails其中job_no喜歡“0711 *”或job_no喜歡“0712 *”

您的答案就在答案中。 使用IN時,無法直接傳遞通配符。 但是,您可以使用子查詢。

嘗試這個:

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

我知道這看起來很瘋狂,因為你可以堅持在WHERE子句中使用OR。 為什么子查詢? 但是,當您必須匹配來自不同來源的詳細信息時,子查詢方法將非常有用。

拉吉

試試這個

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

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

丹扎米爾

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

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

在Teradata,這很好用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM