none
T-SQL Leeres Feld ersetzen RRS feed

  • Frage

  • Hallo,

    in einigen meiner Tabellenfelder können NULL-Werte stehen oder die Felder sind leer.

    In diesen Fällen möchte ich das meine Abfrage für diese Felder CHAR(1) zurück gibt.

    Bei den Felder mit NULL-Werten bekomme ich das ja auch mit ISNULL hin.

    Leider klappt das nicht bei Leeren Feldern.

    Ich habe folgendes versucht:

    ISNULL([Feld], CHAR(1)

    Um bei leeren Felder auch mit CHAR(1)  zu erhalten habe ich es mit

    REPLACE([Feld], N'', CHAR(1)) probiert, was aber leider nicht funktioniert hat.

    Ein Weg wäre vielleicht mit CASE WHEN, da die SQL-Anweisung aber dynamisch zusammen gebaut wird und für mehrere Felder benötigt wird, wäre das an dieser

    doch ein wenig zu komplizeirt.

    Hat Jemand eine Idee, wie ich das lösen kann?

    Gruß

    cheapy

    Mittwoch, 12. September 2012 12:38

Antworten

  • So, wer lange googelt findet was er benötigt:

    Hiermit komme ich zu dem Ergebnis das ich benötige:

    ISNULL(NULLIF(<Spalte>, N''), CHAR(1))


    Um es vorweg zu nehmen:

    "Char(1)" dient in dem String lediglich als Platzhalter ...
    • Als Antwort markiert Cheaptrick_la Donnerstag, 13. September 2012 05:43
    • Bearbeitet Cheaptrick_la Donnerstag, 13. September 2012 06:24
    Donnerstag, 13. September 2012 05:43

Alle Antworten

  • Hi,

    SELECT ... FROM ... WHERE ISNULL( <Spalte>, '' ) = ''



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 12. September 2012 13:34
    Moderator
  • Hallo Stefan,

    ISNULL funktioniert an der Stelle nicht, da das Feld nicht NULL ist sondern leer!

    Die Funktion ISNULL(<Spalte>, NeuerWert) greift nur bei NULL aber nicht bei leeren Feldern.

    Mit "leeren Feldern" meine ich die Felder die keinen Inhalt habe aber uch nicht NULL sind, als bei einem Query nichts anzeigen.

    Würden sie NULL sein, würde dann ja auch NULL angezeigt.

    Und wie cih schon anmerkte, mit umfangreicheren Konstrukten möchte ich möglichst nicht arbeiten, da der SQL-Befehl für diese Abfragen dynamisch zusammen gebaut wird.

    Gruß

    cheapy

    Mittwoch, 12. September 2012 13:47
  • Hi,

    eben darum schreibe ich ja WHERE ISNULL( <Spalte>, '' ) = ''

    Damit werden NULL Werte in '' (Leerstring) umgewandelt und damit dann sowohl alle Zeilen geliefert in denen <Spalte> entweder NULL oder eben '' (Leerstring) ist.

    Falls es um Feldinhalte geht, die nicht leer sind, sondern nur aus Leerzeichen bestehen, also bspw. '    ', musst Du noch ein RTRIM( LTRIM( .. ) ) drum rum setzen.

    SELECT ... FROM ... WHERE RTRIM( LTRIM( ISNULL( <Spalte>, '' ) ) ) = ''
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 12. September 2012 13:54
    Moderator
  • Kann sein das ich mich unglücklich ausgedrückt habe aber ich will ja keinen Leerstring!

    Ich muss Null-Werte und Leerstrings durch CHAR(1) ersetzen!

    Das geht bei Leerstings nun mal nicht mit REPLACE, zumindest bekomme ich es nicht hin.

    Das nächst Problem ist die SQL-Anweisung, derzeit geht es um 10 Spalten, kann aber mehr werden.

    Der SQL-String wird anhand einer Definitionstabelle zusammen gebaut, und je Umfangreicher meine Anweisungen werden umso größer wird der SQL-String. Der drüfte mir dann irgendwann um die Ohren fliegen.

    Mittwoch, 12. September 2012 14:15
  • Hi,

    was soll CHAR(1) sein? Wirklich Ascii SOH?

    Wenn Du das einzeln so brauchst, dann geht das bspw. so:

    SELECT CHAR(1) FROM <Tabelle> WHERE ISNULL( <Spalte>, '' ) = ''

    Und wenn es um mehrere Spalten bzw. ums Auslesen aller Werte, nur halt mit ersetzten NULL Werten und Leerstrings geht, kommst Du wahrscheinlich an CASE nicht vorbei.

    SELECT CASE
               WHEN ISNULL( <Spalte>, '' ) = '' THEN CHAR( 1 )
               ELSE <Spalte>
           END AS <Spalte>
    FROM <Tabelle>

    Probleme mit der Komplexität sehe ich da eigentlich keine. Wenn es doch welche geben sollte, lad dir die Inhalte in eine Tablevariable oder eine temporäre Tabelle, aktualisier die Werte und lies dann das wieder aus.

    Aktualisieren kannst Du dann bspw. per:

    UPDATE <TableVariable> SET <Spalte> = CHAR(1) WHERE ISNULL( <Spalte>, '' ) = ''


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 12. September 2012 14:43
    Moderator
  • So, wer lange googelt findet was er benötigt:

    Hiermit komme ich zu dem Ergebnis das ich benötige:

    ISNULL(NULLIF(<Spalte>, N''), CHAR(1))


    Um es vorweg zu nehmen:

    "Char(1)" dient in dem String lediglich als Platzhalter ...
    • Als Antwort markiert Cheaptrick_la Donnerstag, 13. September 2012 05:43
    • Bearbeitet Cheaptrick_la Donnerstag, 13. September 2012 06:24
    Donnerstag, 13. September 2012 05:43