Domanda

Voglio unire 2 tabelle 'indirizzi' e 'user_info' su user_id e app_id (che è un numero o è nullo), come questi 2 esempi:

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id is null

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id = 1234

Quello che dovrebbe essere l'app_id è complicato e ho scritto una funzione per restituirlo. Restituisce una stringa, che sarebbe ad esempio "quot è nulla" o " = 1234 " ;. Sto cercando di chiamarlo con questa sintassi:

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id dbo.fnGetAppId(addresses.user_id)

Ottengo questo errore:

  

Messaggio 4145, livello 15, stato 1, riga 3 An   espressione di tipo non booleano   specificato in un contesto in cui a   condizione prevista, vicino a "dbo".

Vorrei mantenere la query molto semplice così com'è senza dover determinare se la funzione restituisce un valore null oppure no.

Puoi suggerire il modo migliore per mantenere la query di chiamata molto semplice?

(Sono su SQL Server 2005.)

È stato utile?

Soluzione

NULL! = NULL. Se address.app_id = NULL o fnGetAppID = NULL, il confronto fallirà. Scriverei il confronto come:

coalesce (address.app_id, 'NULLSTRING') = coalesce (dbo.fnGetAppID (address.user_id), 'NULLSTRING')

Altri suggerimenti

Sembra che ti manchi solo un = segno

address.app_id dbo.fnGetAppId (address.user_id)

anziché

address.app_id = dbo.fnGetAppId (address.user_id)

Quindi se fnGetAppId è null allora questa query è simile alla seguente?

select * from user_info left outer join addresses on addresses.user_id = user_info.user_id and null

Dubito che sia quello che vuoi. :)

Potresti voler fare un semplice controllo nella tua logica, prima di chiamare la query, per gestire correttamente un null per fnGetAppId e come ha detto Clyde hai anche bisogno di un segno = per un non null

.

Come ha sottolineato James Black, hai E dove probabilmente vuoi DOVE. Oltre a ciò, ti suggerisco di rendere la funzione booleana (passando address.app_id ad essa come un altro argomento), in modo che possa eseguire un IS NULL o = 1234 a seconda dei casi (la soluzione COALESCE di Bill è davvero intelligente, ma mettendo il confronto appropriato all'interno della funzione è più semplice, IMO).

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