Query SQL: utilizzare Mi piace solo se non esiste una corrispondenza esatta?

StackOverflow https://stackoverflow.com/questions/75819

  •  09-06-2019
  •  | 
  •  

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top