2011-12-21 40 views
1

的SQL Server 2005SQL任何1列出第二

我有2所列出:

  1. ( 'A', 'B', 'C', 'd')

  2. ( 'd', 'E', 'F', 'G')

我需要做一个WHERE这些2第一个动态SQL字符串中,是这样的:

select * 
from tbl 
where ... afewconditionshere ... 
     AND anyitemfrom[('a', 'b', 'c', 'd')] is inside [('d', 'e', 'f', 'g')] 

它看起来有点怪异,但我得到来自第三方这些数据,不能使太大的变化

名单总是有< 20个项目里面

UPDATE

一个, b,c,d,e,f,g就像是与表格无关的安全事物,这个想法是,如果你有这个anyitemfrom [('a','b','c','d' )]在[('d','e','f','g')]内,那么您可以查看返回的记录,否则不应该返回记录

是这个条件应该基本返回true或false

+0

这两个列表是来自外部的数据(数据未在数据库中找到)的东西吗?如果是这样,这些条件应该在SQL的外部得到满足,而不是附加为新条件。 (除非我误解了这个问题)。但是,SQL确实有'IN'子句。例如'WHERE mycolumn IN('a','b','c','d') – 2011-12-21 15:25:30

+0

如果您正在动态构建SQL,并且在准备动态SQL时您的程序已知这两个列表的内容字符串,是不是'anyitemfrom [('a','b','c','d')]在[('d','e','f','g')]'condition减少到一个简单的“真”或“虚假”的答案?我错过了什么吗? – dasblinkenlight 2011-12-21 15:27:53

+0

@Swoosh:是否有任何项目与数据库相关?如果没有,为什么你想在SQL中做到这一点? – 2011-12-21 16:08:54

回答

0

我理解了它

我使用的是这样的:

CREATE TABLE #t (UserName VARCHAR(50)) 

DECLARE @sql VARCHAR(MAX) 
SELECT @sql = 'INSERT INTO #t SELECT ''' + REPLACE(@UserList, ',', ''' UNION SELECT ''') + '''' 
PRINT (@sql) 
EXEC (@sql) 

SELECT * FROM #t 

IF OBJECT_ID('tempdb..#t') IS NOT NULL BEGIN DROP TABLE #t END 

两个列表 然后我能够加入他们的行列,并使用加入的总记录

+0

这是SQL注入漏洞,通过黑客UserName。 – JamieSee 2011-12-21 16:53:59

0

根据你的问题,但如果你执行一个IN(好像),再进行第二次IN()对过滤后的数据集,你应该让你在做什么寻找:

select * from 
(
select * from tbl 
where ... afewconditionswhere ... 
and anyitemfrom in('a', 'b', 'c', 'd') 
) as derived 
where derived.anyitemfrom in ('d', 'e', 'f', 'g') 
+0

如果这些值不是静态的,您可以始终将'a','b','c','d'作为参数传递给您的过程?如果是这样,那么你仍然可以对表变量的IN()进行IN()作为一个想法。无论是或者你可以使用动态SQL。 – 2011-12-21 15:30:54

0
declare @cmd varchar(2000), @list1 varchar(100), @list2 varchar(100) 

select @list1 = "('a', 'b', 'c', 'd')", @list2 = "('d', 'e', 'f', 'g')" 

select @cmd = 
'select * from 
(
select * from tbl 
where ... afewconditionswhere ... 
and anyitemfrom in ' + @list1 + ' 
) as derived 
where derived.anyitemfrom in ' + @list2 


exec(@cmd) 
0
WHERE (
     SELECT COUNT(*) 
      FROM (select 'a' union all select 'b' union all select 'c' union all select 'd' 
       intersect 
       select 'd' union all select 'e' union all select 'f' union all select 'g' 
       ) 
     ) > 0 
相关问题