[英]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
我首先添加了一個靜態表,其中包含我的通配符結果的所有可能性(該公司有4個字符的nvarchar代碼作為他們的地方,他們通配他們的當地人),即他們可能有456? 這會給他們456 [1]到456 [Z],即0-9和az
我必須編寫一個腳本來拉取當前用戶(聲明它們)並為已聲明的用戶拉出掩碼。
創建一些臨時表,只是基本表,以對當前用戶的行號進行排名
循環遍歷每個結果(你或這個或那個......)
插入測試表。
這是我使用的腳本:
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.