2011-11-18 9 views
6

Итак, у меня есть ужасный запрос, который существует в MS Access, который я пытаюсь переписать в SQL Server. В основном я получаю данные, которые поступают из текстового файла, который я пытаюсь отфильтровать, исходя из определенных критериев.SQL Where Clause с 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 содержала данные для одного пользователя/суммы/businessDate? Вы должны иметь возможность создать существующую структуру с помощью сводного запроса, и фильтрация будет намного проще. –

+1

@JimGarrison Я согласен, что было бы намного проще фильтровать этот путь, но реструктурировать данные было бы сложно. В этом файле больше полей, чем показано выше, около 70 столбцов данных было бы очень сложно. – Taryn

+3

баланс сил зла с хорошим – swasheck

ответ

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

Or (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