Query SQL: utilizzare Mi piace solo se non esiste una corrispondenza esatta?
Domanda
Sto riscontrando un problema con una query che attualmente utilizza
LEFT JOIN weblog_data AS pwd
ON (pwd.field_id_41 != ''
AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
Tuttavia sto scoprendo che ne ho bisogno per usarlo solo se prima non esiste una corrispondenza esatta.Quello che sta succedendo è che la query è double dipping a causa dell'uso di LIKE
, quindi se verifica prima una corrispondenza esatta, eviterà il problema della doppia immersione.Qualcuno può darmi qualche ulteriore indicazione?
Soluzione
Sembra che tu voglia unire le tabelle con alias pwd e ewd nel tuo snippet basandoti prima su una corrispondenza esatta e, se fallisce, sul confronto simile che hai ora.
Prova questo:
LEFT JOIN weblog_data AS pwd1 ON (pwd.field_id_41 != '' AND pwd.field_id_41 = ewd.field_id_32)
LEFT JOIN weblog_data AS pwd2 ON (pwd.field_id_41 != '' AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
Quindi, nella clausola select, usa qualcosa del genere:
select
isnull(pwd1.field, pwd2.field)
tuttavia, se hai a che fare con un campo che può essere nullo in pwd, ciò causerà problemi, comunque dovrebbe funzionare:
select
case pwd1.nonnullfield is null then pwd2.field else pwd1.field end
Dovrai anche assicurarti di creare un gruppo, poiché l'unione a pwd2 aggiungerà comunque righe al set di risultati, anche se finisci per ignorare i dati in esso contenuti.
Altri suggerimenti
stai parlando di valutazione del cortocircuito.
Dai un'occhiata a questo articolo potrebbe aiutarti:http://beingmarkcohen.com/?p=62
utilizzando TSQL, esegui una corrispondenza esatta, controlla il numero di righe == 0, in tal caso, esegui simili, altrimenti non eseguire simili o aggiungi risultati simili sotto le corrispondenze esatte.
Posso solo pensare di farlo in codice.Cerca una corrispondenza esatta, se il risultato è vuoto cerca un MI PIACE.Un'altra opzione è un WHERE all'interno di questa query in modo tale che WHERE ({count from esatta corrispondenza}=0), nel qual caso, non verrà eseguito il confronto con LIKE se la corrispondenza esatta restituisce più di 0 risultati.Ma è terribilmente inefficiente...per non parlare del fatto che usarlo in modo significativo nel codice è piuttosto difficile.
opterei per un If (contare dalla corrispondenza esatta = 0), quindi eseguire la query simile, altrimenti utilizzare semplicemente il risultato della corrispondenza esatta.