2015-10-29 22 views
6

Sto provando a scrivere codice che mi permetta di controllare se ci sono dei casi di un particolare schema all'interno di una tabella.Il modo più veloce per verificare se esiste un caso di un modello in una colonna utilizzando SQL

Il modo Attualmente sto facendo è qualcosa di simile

select count(*) 
from database.table 
where column like (some pattern) 

e vedere se il conteggio è maggiore di 0.

Sono curioso di vedere se c'è un modo per accelerare questo processo come questo tipo di ricerca del modello avviene in un ciclo nella mia query e tutto quello che ho bisogno di sapere è se c'è anche uno di questi casi piuttosto che il numero totale di casi.

Qualsiasi suggerimento sarà apprezzato.

MODIFICA: lo sto eseguendo all'interno di una procedura memorizzata Teradata ai fini della convalida della qualità dei dati.

+0

Come stai usando questo? Un ciclo in una query è in genere un brutto segno ... SQL funziona molto meglio quando si utilizzano approcci basati su set piuttosto che cicli. Più contesto sarebbe utile per darti una buona risposta. –

+0

Specifica anche il tuo RDBMS mentre pubblichi la tua domanda in quanto i differenti DB hanno diverse funzioni. –

+0

Grazie per tutti i commenti. Avrei dovuto spiegarlo meglio Sto usando queste query all'interno di una stored procedure Teradata e sto cercando di usarlo per fare un controllo di qualità dei dati sulla nostra tabella. Il concetto di base è avere un ciclo con per passare attraverso le varie colonne nella tabella e fare il controllo usando l'istruzione select count per vedere se ci sono casi che sono al di fuori di ciò che ci aspettiamo di vedere.Penso che usare l'IF Exist potrebbe funzionare meglio come suggerito di seguito, ma penso che il caso normale sarà dove non ci sono corrispondenze. Grazie. –

risposta

2

Se non è necessario il conteggio effettivo, il modo più efficace in Teradata utilizzerà EXISTS:

select 1 
where exists 
(select * 
    from database.table 
    where column like (some pattern) 
) 

Ciò restituirà un risultato vuoto impostare se il modello non esiste.

+0

Attualmente sto ottenendo SELECT Failed. 3706: Errore di sintassi: previsto qualcosa tra ")" e "*". quando si esegue questa query. –

+0

@HangilJang: Certo che fallisce, non ci dovrebbe essere '*', correggerò la mia risposta – dnoeth

1

In termini di prestazioni, un approccio migliore è quello di:

  1. selezionare il set di risultati in base al modello;
  2. limitare la dimensione del set di risultati a 1.
  3. Verificare se è stato restituito un risultato.

Ciò impedisce al motore del database di eseguire una scansione completa della tabella e la query verrà restituita non appena viene rilevato il primo record corrispondente.

La query effettiva dipende dal database che si sta utilizzando. In MySQL, sarebbe qualcosa di simile:

SELECT id FROM database.table WHERE column LIKE '%some pattern%' LIMIT 1; 

In Oracle sarebbe simile a questa:

SELECT id FROM database.table WHERE column LIKE '%some pattern%' AND ROWNUM = 1; 
3

Utilizzando EXISTS sarà più veloce se in realtà non c'è bisogno di sapere quante partite ci sono . Qualcosa del genere funzionerebbe:

IF EXISTS (
    SELECT * 
    FROM bigTbl 
    WHERE label LIKE '%test%' 
) 
    SELECT 'match' 
ELSE 
    SELECT 'no match' 

Questo è più veloce perché una volta trovata una singola corrispondenza può restituire un risultato.