Ecco un problema che ho più volte incontrato mentre gioca con la Stack Exchange Data Explorer, che si basa su T-SQL:modello T-SQL corrispondenza con le eccezioni
Come cercare una stringa tranne quando si verifica come sottostringa di qualche altra stringa?
Per esempio, come posso selezionare tutti i record di una tabella MyTable
dove la colonna MyCol
contiene la stringa foo
, ma ignorando qualsiasi foo
s che fanno parte della stringa foobar
?
Un tentativo di rapido e sporco sarebbe qualcosa di simile:
SELECT *
FROM MyTable
WHERE MyCol LIKE '%foo%'
AND MyCol NOT LIKE '%foobar%'
ma ovviamente questo non riuscirà a corrispondere per esempio MyCol = 'not all foos are foobars'
, che voglio abbinare.
Una soluzione che è venuta in mente è quello di sostituire tutte le occorrenze di foobar
con alcuni marcatore fittizio (che non è una stringa di foo
) e poi la verifica di eventuali rimanenti foo
s, come in:
SELECT *
FROM MyTable
WHERE REPLACE(MyCol, 'foobar', 'X') LIKE '%foo%'
Funziona, ma sospetto che non sia molto efficiente, dal momento che deve eseguire il REPLACE()
su ogni record nella tabella. (Per SEDE, si tratta in genere della tabella Posts
, che attualmente ha circa 30 milioni di righe.) I modi migliori per farlo?
(FWIW, the real use case che ha spinto a questa domanda era alla ricerca di SO messaggi con URL di immagine che utilizzano il prefisso http://
schema, ma non puntano all'host i.stack.imgur.com
.)
Stai giocando con la versione hosted, o stai scaricando i dati con cui giocare sul sistema locale? Se si sta eseguendo il download localmente o si è in grado di farlo se non si è a conoscenza di un'opzione, è possibile aggiungere la funzionalità RegEx tramite SQLCLR. Ad esempio, è possibile scaricare la libreria [SQL #] (http://SQLsharp.com/) (che ho scritto, ma la roba RegEx è nella versione gratuita), installarla in un DB 'Utility' e quindi utilizzare in query per questa o altre cose :-). –
@srutzky: sto utilizzando il DB ospitato. Suppongo che potrei esaminare il download dei dati, ma sarebbe preferibile una soluzione che funziona online. –