2009-03-04 5 views
6

Sto cercando di trovare un modo, se possibile, di usare IN e LIKE insieme. Quello che voglio realizzare è mettere una subquery che estrae un elenco di dati in una istruzione IN. Il problema è che l'elenco dei dati contiene caratteri jolly. C'è un modo per fare questo?C'è un modo per combinare IN con LIKE in un'istruzione SQL?

Solo qualcosa di cui ero curioso.

Example of data in the 2 tables 

Parent table 

ID Office_Code Employee_Name 
1  GG234   Tom 
2  GG654   Bill 
3  PQ123   Chris 

Second table 

ID Code_Wildcard 
1  GG% 
2  PQ% 

Chiarire nota (tramite terze parti)

Dal momento che sto vedendo diverse risposte che non sembra per affrontare quello che chiede Ziltoid, ho pensato che provo chiarire quello che penso che significa .

In SQL, "WHERE col IN (1,2,3)" equivale approssimativamente a "WHERE col = 1 OR col = 2 OR col = 3".

Sta cercando qualcosa che mi pseudo-codice come

WHERE col IN_LIKE ('A%', 'TH%E', '%C') 

che sarebbe grosso modo l'equivalente di

WHERE col LIKE 'A%' OR col LIKE 'TH%E' OR col LIKE '%C' 

Le risposte Regex sembrano venire più vicino; il resto sembra lontano dal marchio.

+0

C'è un modo per fornirci un campionario di tabelle/record e quindi fornirci l'output previsto/desiderato? Ciò aiuterebbe le persone a costruire una query che potesse soddisfare le tue esigenze. – TheTXI

+0

Vuoi specificare RDBMS in modo che le persone possano trovare una risposta ottimale per la tua domanda? Grazie. – Sung

+0

Aggiunto un esempio dei dati che sto utilizzando – Ziltoid

risposta

8

Non sono sicuro di quale database si sta utilizzando, ma con Oracle è possibile ottenere risultati equivalenti mediante aliasing della sottoquery nella clausola FROM anziché utilizzarlo in una clausola IN. Usando il tuo esempio:

select p.* 
from 
    (select code_wildcard 
    from second 
    where id = 1) s 
    join parent p 
     on p.office_code like s.code_wildcard 
+0

E 'stato. Molte grazie. – Ziltoid

2

È possibile utilizzare un'istruzione LIKE per ottenere un elenco di ID e quindi utilizzarlo nell'istruzione IN.

Ma non è possibile combinare direttamente IN e LIKE.

3

vuoi dire somethign come:

select * FROM table where column IN (
    SELECT column from table where column like '%%' 
) 

realtà questo dovrebbe essere scritto come:

SELECT * FROM table where column like '%%' 

Utilizzando un sub query di selezione è davvero utile quando si deve tirare record sulla base di una serie di logica che non vorrete nella query principale.

qualcosa di simile:

SELECT * FROM TableA WHERE TableA_IdColumn IN 
(
    SELECT TableA_IdColumn FROM TableB WHERE TableA_IDColumn like '%%' 
) 

aggiornamento alla domanda:

Non è possibile combinare una dichiarazione IN con una dichiarazione come:

dovrete fare tre diversi come dichiarazioni cerca sui vari caratteri jolly.

+0

No. I dati nella colonna contengono effettivamente caratteri jolly. – Ziltoid

+0

La query esterna non fa nulla. –

+0

sì, lo so, stavo lavorando per aggiornare la risposta. – kemiller2002

6

In MySQL, utilizzare REGEXP:

WHERE field1 REGEXP('(value1)|(value2)|(value3)') 

Stesso in Oracle:

WHERE REGEXP_LIKE(field1, '(value1)|(value2)|(value3)') 
+0

Non penso che le parentesi siano necessarie. 'value1 | value2 | value3' dovrebbe fare. Per non dimenticare che value1..n deve essere scappato secondo le regole regex prima di inserirli. – Tomalak

0

Si potrebbe fare la parte Come in una sottoquery forse?

Select * From TableA Dove X (Seleziona A da TableB dove B Like '% 123%')

+0

Che non funzionerà. I dati per la sottoquery hanno effettivamente definiti i caratteri jolly. cioè I dati nella colonna dicono già% 123%. – Ziltoid

0

tsql ha la dichiarazione contains per un tavolo abilitato full-text-search.

CONTAINS(Description, '"sea*" OR "bread*"') 
+0

Dispone di CONTIENE su una tabella abilitata per la ricerca full-text, ovvero. – Tomalak

+0

È possibile utilizzare una sottoquery per il 2 ° parametro? – Ziltoid

+0

proprio tu sei Tomalak. Non sono sicuro di quello Ziltoid. – dotjoe

2

Forse qualcosa del genere?

In questo esempio ho utilizzato una tabella con i valori per semplicità, ma è possibile modificarla facilmente in una sottoquery. Se hai una lista di grandi dimensioni (come decine di migliaia), le prestazioni potrebbero essere difficili.

0

Se sto leggendo la domanda correttamente, vogliamo tutte le righe padre che hanno un codice_ufficio che corrisponde a qualsiasi Code_Wildcard nella tabella "Secondo".

In Oracle, almeno, questa query raggiunge che:

SELECT * 
FROM parent, second 
WHERE office_code LIKE code_wildcard; 

mi sto perdendo qualcosa?

1
select * 
    from parent 
where exists(select * 
       from second 
       where office_code like trim(code_wildcard)); 

code_wildcard Trim solo nel caso in cui si è gli spazi finali.