Mit Hilfe einer Funktion in einer Abfrage, die einen String oder eine null zurückgibt

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich möchte 2 Tische 'addresses' und 'user_info' auf user_id beizutreten und app_id (Das ist eine Zahl, oder es ist null), wie diese zwei Beispiele:

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

Was sollte die app_id kompliziert sein wird, und ich geschrieben haben eine Funktion, die sie zurückkehren. Es gibt eine Zeichenfolge, die zum Beispiel wäre „null“ oder „= 1234“. Ich versuche es mit dieser Syntax zu nennen:

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)

Ich bekomme diese Fehlermeldung:

  

Msg 4145, Ebene 15, Status 1, Zeile 3 ein   Expression von nicht-Typ boolean   in einem Kontext angegeben, wo ein   Zustand wird erwartet, in der Nähe von 'dbo'.

Ich mag die Abfrage sehr einfach zu halten, wie es ohne zu bestimmen, ob die Funktion einer Null oder nicht zurückkehrt.

Können Sie die beste Möglichkeit, die Berufung Abfrage zu halten sehr einfach?

(Ich bin in SQL Server 2005).

War es hilfreich?

Lösung

NULL! = NULL. Wenn entweder address.app_id = NULL oder fnGetAppID = NULL, der Vergleich fehl. Ich würde schreiben Sie den Vergleich als:

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

Andere Tipps

Es sieht aus wie du bist nur ein = Zeichen fehlt

addresses.app_id dbo.fnGetAppId (addresses.user_id)

statt

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

Also, wenn fnGetAppId null ist dann diese Abfrage sieht wie folgt aus?

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

Ich bezweifle, dass das, was Sie wollen. :)

Sie möchten eine einfache Prüfung in Ihrer Logik tun, bevor die Abfrage aufrufen, um richtig einen Null für fnGetAppId handhaben und wie Clyde erwähnt müssen Sie auch ein = Zeichen für eine nicht-null

.

Wie James Black wies darauf hin, Sie haben und wo Sie wollen wahrscheinlich WHERE. Darüber hinaus schlage ich Ihnen die Funktion ein boolean ein (vorbei an address.app_id, um es als ein weiteres Argument) machen, so kann sie führen eine IS NULL oder = 1234 als angemessen (Bills COALESCE Lösung ist in der Tat klug, aber die entsprechende Vergleich setzen innerhalb der Funktion ist einfacher, IMO).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top