2009-07-02 69 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]%