2011-11-18 76 views
6

所以我有一个糟糕的查询,目前存在于MS Access中,我试图在SQL Server中重写。基本上,我从一个文本文件中获取数据,我试图根据特定条件对其进行过滤。SQL Where和LIKE和IN条款

我的问题来自数据在文本文件中的方式。我的表是与此类似:

Table1 
BusinessDate DateTime 
Amount   money 
User1   varchar 
User2   varchar 
User3   varchar 
User4   varchar 
...   varchar 
User16   varchar 

我有了日期,然后有16列与已经由其他用户添加数据的数据表。本表中还有其他一些字段,但对于这个问题它们是不必要的。

当前查询对15个值进行过滤,其中userId就像是某个东西。

SELECT * 
FROM Table1 
WHERE (User1 Like 'AB%' Or User1 Like 'CD%' Or User1 Like 'EF%'...) 
OR (User2 Like 'AB%' Or User2 Like 'CD%' Or User2 Like 'EF%'...) 

我想要做的是将类似的值存储在表中,以便我可以在我的查询中加入他们。我不知道所有的值,所以我需要使用通配符,因为它可能是字母数字字符的任意可能组合。因此,我将有一个这样的表:

ValueTable 
AB% 
CD% 
EF% 
HI% 
... 

然后我的查询是类似于此的东西,但我不认为这是可能的

SELECT * 
FROM Table1 
WHERE User1 Like IN (SELECT Value FROM ValueTable) 
OR User2 Like IN (SELECT Value FROM ValueTable) 

是否有可能做这样的事情?如果是这样,应该使用什么语法,因为我完全难倒了。

+0

的数据模型是错误的。您是否可以重构数据,以便每个Table1行包含单个用户/金额/业务日期的数据?您应该能够使用数据透视查询创建现有结构,并且过滤将更加容易。 –

+1

@JimGarrison我同意过滤这种方式会容易得多,但重构数据将会很困难。这个文件比我在上面显示的大约70列数据有更多的字段,这将是非常困难的。 – Taryn

+3

平衡邪恶的力量很好 – swasheck

回答

11
SELECT * 
FROM Table1 
WHERE EXISTS (SELECT * 
       FROM ValueTable 
       WHERE User1 Like Value 
         OR User2 Like Value) 

或(2008语法)

SELECT * 
FROM Table1 
WHERE EXISTS (SELECT * 
       FROM (VALUES(User1), 
          (User2), 
          (User3), 
          (User4), 
          /* ... */ 
          (User15), 
          (User16)) Users(U) 
         JOIN ValueTable 
         ON U Like Value) 
+0

完美的作品,非常感谢你。 – Taryn