2011-11-18 21 views
6

Quindi ho una query terribile che la corrente esiste in MS Access che sto cercando di riscrivere in SQL Server. Fondamentalmente ottengo dati che provengono da un file di testo che sto cercando di filtrare in base a criteri specifici.SQL Where Clausola con LIKE e IN

I miei problemi riguardano il modo in cui i dati si trovano nel file di testo. Il mio tavolo è simile a questo:

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

Ho una tabella di dati che ha la data e poi ha 16 colonne con dati che sono stati aggiunti da un utente diverso. Ci sono altri campi in questa tabella ma non sono necessari per questa domanda.

La query corrente esegue il filtraggio su 15 valori in cui ID utente è come qualcosa.

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%'...) 

Quello che sto cercando di fare è di memorizzare i valori come in una tabella in modo che possano unirsi a loro nella mia interrogazione. Non conosco tutti i valori, quindi ho bisogno di usare il carattere jolly perché potrebbe essere una qualsiasi combinazione possibile di caratteri alfanumerici. Così avrò una tabella come questa:

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

Quindi la mia domanda sarebbe qualcosa di simile a questo, ma io non credo che questo sia possibile

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

E 'possibile fare qualcosa del genere? Se è così, quale sintassi dovrebbe essere usata perché sono totalmente perplesso.

+0

Il modello di dati è sbagliato. Riesci a ristrutturare i dati in modo che ogni riga di Table1 contenga dati per un singolo utente/importo/businessDate? Dovresti essere in grado di creare la struttura esistente utilizzando una query pivot e il filtraggio sarà MOLTO più semplice. –

+1

@JimGarrison Sono d'accordo che sarebbe molto più facile filtrare in questo modo, ma la ristrutturazione dei dati sarebbe difficile. Questo file ha molti più campi di quello che ho mostrato sopra circa 70 colonne di dati sarebbe molto difficile. – Taryn

+3

bilanciare le forze del male con il buono – swasheck

risposta

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

O (2008 sintassi)

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

funziona perfettamente, grazie mille. – Taryn