none
SSRS Ausdruck ersetzen wenn leer oder NULL RRS feed

  • Frage

  • Hallo,
    gibt es eine Möglichkeit in einem Report zu definieren, dass ein leerer Tabellenausdruck durch ein Wort 'xyz' ersetzt wird? Kann ich das irgendwie bei den Expressions definieren?
    Danke für die Hilfe!
    Olaf

    Mittwoch, 13. März 2019 10:32

Antworten

  • Hallo Olaf,

    entgegen meiner ursprünglichen Meinung liefert SUBSTRING bei kürzeren Strings doch keinen Fehler, sondern einfach eine leere Zeichenfolge. Das vereinfachte das Ganze natürlich etwas.

    Da ich nicht genau weiß, was in dem Fall, dass deine Spalte weniger als 5 Zeichen lang ist (Du liest ja das fünfte Zeichen aus) gemacht werden soll, hier mal zwei Beispiele:

    SELECT *,
           CASE
               WHEN NULLIF( <Spalte>, '' ) IS NULL THEN 'sonstige'
               ELSE
                   CASE
                       WHEN LEN( <Spalte> ) >= 5 THEN SUBSTRING( artikelID, 4, 1 )
                       ELSE <Spalte>
                   END
           END AS <Spalte>
    FROM   <Tabelle>

    Damit wird für alle NULL und Leerzeichenwerte "sonstige", für Strings mit Länge >= 5 das fünfte Zeichen und für alles andere der komplette String in Spalte zurückgeliefert.

    SELECT *,
           CASE
               WHEN LEN( <Spalte> ) < 5 OR NULLIF( <Spalte>, '' ) IS NULL THEN 'sonstige'
               ELSE SUBSTRING( <Spalte>, 4, 1 )
           END AS <Spalte>
    FROM   <Tabelle>

    Diese Abfrage liefert dann "substring" für alle NULL Werte, leeren Zeichenfolgen und Strings kürzer als 5 Zeichen.

    Du musst halt definieren, was genauwann passieren soll.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Olaf113 Donnerstag, 14. März 2019 12:36
    Mittwoch, 13. März 2019 14:08
    Moderator
  • Wie wäre es denn mi:

    coalesce(nullif(Wert, Vergleichswert), Ersatzwert)

    Zu beachten ist, dass nach Möglichkeit alle Werte vom selben Typ sind, ansonsten wird u.U. ein nicht gewollter Autocast durchgeführt.
    • Bearbeitet Der Suchende Mittwoch, 13. März 2019 18:37
    • Als Antwort markiert Olaf113 Donnerstag, 14. März 2019 12:36
    Mittwoch, 13. März 2019 17:47

Alle Antworten

  • Hallo Olaf,

    ich würde da eher an der Abfrage, die deine Datenquelle darstellt, ansetzen. Irgendwo gibt es ja wahrscheinlich ein SELECT ... FROM .... Dort könntest Du bspw. wie folgt arbeiten:

    SELECT ...,
           ISNULL( <Spalte>, 'Abc' ) AS Spalte
    FROM   <Tabelle>
    ...

    Damit wird dann für alle Datensätze, bei denen in <Spalte> NULL steht, 'Abc' als <Spalte> zurückgegeben.

    Wenn das auch gelten soll, wenn es nicht NULL, sondern eine leere Zeichenfolge ist, geht das bspw. so:

    SELECT ...,
           ISNULL( NULLIF( <Spalte>, '' ), 'Abc' ) AS Spalte
    FROM   <Tabelle>
    ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 13. März 2019 11:39
    Moderator
  • Hallo Stefan,
    prinzipiell habe ich schon versucht, mir so zu helfen. Hier gibt es aber ein Problem, weil dadurch leider nicht die Zeichenfolge erzeugt werden kann, die ich benötige.

    Es ergibt sich also ein Folgeproblem: 
    Das SELECT funktioniert so, kann aber nur ein Zeichen ausgeben.

    SELECT
    ISNULL(NULLIF((substring(ResourceDepartment,4,1)), N''), 0) as ResourceDepartment_Null
    FROM
    Es soll eben nicht 0 (oder ein einzelnes anderes Zeichen ausgegeben werden) sondern die Zeichenfolge 'sonstige'. Wenn das Feld allerdings gefüllt ist, dann soll eben nur ein Buchstabe ausgegeben werden. Deswegen der substring.

    Gruß
    Olaf


     
    • Bearbeitet Olaf113 Mittwoch, 13. März 2019 12:18
    Mittwoch, 13. März 2019 12:18
  • Hallo Olaf,

    SELECT ...,
           CASE
               WHEN NULLIF( <Spalte>, '' ) IS NULL THEN 'sonstige'
               ELSE SUBSTRING( <Spalte>, 4, 1 )
           END AS <Spalte>
    FROM   <Tabelle>
    ...

    Beachten musst Du natürlich noch, dass Substring fehlschlägt, wenn dein Wert in der Spalte kürzer ist als die Startposition des Substrings.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 13. März 2019 12:45
    Moderator
  • Hallo Stefan,
    prinzipiell funktioniert der SELECT von Dir . Danke dafür!
    Allerdings war der Hinweis
    "Beachten musst Du natürlich noch, dass Substring fehlschlägt, wenn dein Wert in der Spalte kürzer ist als die Startposition des Substrings." auch der Grund dafür, dass ich mir anders helfen musste.
    Ich habe jetzt folgenden Weg gewählt:

    SELECT
    ISNULL(NULLIF((substring(ResourceDepartment,4,1)), N''), 0) as ResourceDepartment_Null
    FROM

    Danach habe ich in der Expression im SSRS folgenden Ausdruck eingetragen:

    =iif(Fields!ResourceDepartment_Null.Value="0","sonstige",Fields!ResourceDepartment_Null.Value)
    Das liefert dann die gewünschte Ausgabe im Report.
    Vielen Dank für die Hilfe!

    Gruß, Olaf




    • Bearbeitet Olaf113 Mittwoch, 13. März 2019 13:51
    Mittwoch, 13. März 2019 13:51
  • Hallo Olaf,

    entgegen meiner ursprünglichen Meinung liefert SUBSTRING bei kürzeren Strings doch keinen Fehler, sondern einfach eine leere Zeichenfolge. Das vereinfachte das Ganze natürlich etwas.

    Da ich nicht genau weiß, was in dem Fall, dass deine Spalte weniger als 5 Zeichen lang ist (Du liest ja das fünfte Zeichen aus) gemacht werden soll, hier mal zwei Beispiele:

    SELECT *,
           CASE
               WHEN NULLIF( <Spalte>, '' ) IS NULL THEN 'sonstige'
               ELSE
                   CASE
                       WHEN LEN( <Spalte> ) >= 5 THEN SUBSTRING( artikelID, 4, 1 )
                       ELSE <Spalte>
                   END
           END AS <Spalte>
    FROM   <Tabelle>

    Damit wird für alle NULL und Leerzeichenwerte "sonstige", für Strings mit Länge >= 5 das fünfte Zeichen und für alles andere der komplette String in Spalte zurückgeliefert.

    SELECT *,
           CASE
               WHEN LEN( <Spalte> ) < 5 OR NULLIF( <Spalte>, '' ) IS NULL THEN 'sonstige'
               ELSE SUBSTRING( <Spalte>, 4, 1 )
           END AS <Spalte>
    FROM   <Tabelle>

    Diese Abfrage liefert dann "substring" für alle NULL Werte, leeren Zeichenfolgen und Strings kürzer als 5 Zeichen.

    Du musst halt definieren, was genauwann passieren soll.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Olaf113 Donnerstag, 14. März 2019 12:36
    Mittwoch, 13. März 2019 14:08
    Moderator
  • Wie wäre es denn mi:

    coalesce(nullif(Wert, Vergleichswert), Ersatzwert)

    Zu beachten ist, dass nach Möglichkeit alle Werte vom selben Typ sind, ansonsten wird u.U. ein nicht gewollter Autocast durchgeführt.
    • Bearbeitet Der Suchende Mittwoch, 13. März 2019 18:37
    • Als Antwort markiert Olaf113 Donnerstag, 14. März 2019 12:36
    Mittwoch, 13. März 2019 17:47
  • Hallo Stefan,
    für meinen Fall funktioniert die erste Abfrage perfekt!

    hallo bfuerchau,
    das ist für mich natürlich die unkomplizierteste und einfachste Lösung!

    Jetzt kann ich die komplette Geschichte im SSRS entwirren und das komplette Problem auf Datenbankebene lösen.
    Danke dafür!

    D A N K E!

    Grüße, Olaf

    Donnerstag, 14. März 2019 12:35