SELECT  
    Siren,
    CASE    WHEN Code_Juridique LIKE 'M%' AND Enseigne IS NOT NULL AND Enseigne <> '' --ok
                THEN 'Enseigne : ' + Enseigne
            WHEN (Sigle IS NULL OR Sigle ='')
                AND (Enseigne IS NULL OR Enseigne ='')
                THEN '' -- ok
            WHEN
                 (Sigle IS NOT NULL OR Sigle <> '' ) THEN 'Sigle : ' + Sigle
            ELSE 'Sigle / Enseigne : ' + Sigle + ' / ' + Enseigne
        END as SigleEnseigne1,
        Sigle,
        Enseigne,
        Code_Juridique
        FROM    #JohnJack

Der Code ist unkompliziert.

Das Problem liegt beim dritten when, wie Sie unten sehen können

enter image description here

Ich hätte nichts in meiner 4. und 5. Zeile haben sollen, aber es gibt mir Sigle :

Ich möchte, dass die Spalte SigleEnseigne1 in der 4. und 5. Zeile leer ist

Vielen Dank für Ihre Erkenntnisse

0
Andy K 23 Dez. 2015 im 17:09

4 Antworten

Beste Antwort

Versuche dies:

SELECT  
    Siren,
    CASE    WHEN ( Code_Juridique LIKE 'M%' ) AND ( IsNull( Enseigne, '' ) <> '' )
                THEN 'Enseigne : ' + Enseigne

            WHEN ( IsNull( RTrim(LTrim(Sigle)), '') = '') AND ( IsNull( Enseigne, '' ) = '')
                THEN '' -- ok

            WHEN ( IsNull( RTrim(LTrim(Sigle)), '' ) <> '' ) 
                THEN 'Sigle : ' + RTrim(LTrim(Sigle))
            ELSE
                'Sigle / Enseigne : ' + IsNull( RTrim(LTrim(Sigle)), '' ) + ' / ' + Enseigne
        END as SigleEnseigne1,
        Sigle,
        Enseigne,
        Code_Juridique
        FROM    #JohnJack
3
shadow 23 Dez. 2015 im 14:37

Neben der Angabe des Offensichtlichen, dass ein (TRUE OR FALSE) = TRUE Ich würde den Code mit ISNULL() und LEN() vereinfachen und kugelsicher machen.

SELECT  
Siren,
CASE    WHEN Code_Juridique LIKE 'M%' AND LEN(ISNULL(Enseigne,'')) > 0  --ok
            THEN 'Enseigne : ' + Enseigne
        WHEN (LEN(ISNULL(Sigle, '')) = 0)
            AND (LEN(ISNULL(Enseigne, '')) = 0) 
            THEN '' -- ok
        WHEN
             LEN(ISNULL(Sigle, '')) > 0 THEN 'Sigle : ' + Sigle
        ELSE 'Sigle / Enseigne : ' + ISNULL(Sigle, '') + ' / ' + ISNULL(Enseigne, '')
    END as SigleEnseigne1,
    Sigle,
    Enseigne,
    Code_Juridique
    FROM    #JohnJack

Wie würde Ihr Code reagieren, wenn diese Felder Leerzeichen enthalten? LEN schneidet nachfolgende Leerzeichen automatisch ab.

2
domenicr 23 Dez. 2015 im 15:03

Diese Zeile verursacht Ihr Problem:

    (Sigle IS NOT NULL OR Sigle <> '' ) THEN 'Sigle : ' + Sigle

... aber das ist nur offensichtlich, weil Sie angeben, dass Sie dieses Ergebnis nicht wollen. Ansonsten verhält sich der Code wie erwartet.

Die einfachste Lösung wäre herauszunehmen:

  'Sigle : ' + Sigle 

Aber das kann genau das sein, wonach Sie suchen. Basierend auf den gegebenen Informationen ist es die Lösung, aber es gibt nicht viele Informationen, die bearbeitet werden müssen

Wenn Sie versuchen, Werte ungleich Null zum Drucken zu bringen, sollte dies eher ein UND als ein ODER sein. Wenn Sie ein ODER verwenden, wird true zurückgegeben, wenn JEDE Bedingung erfüllt ist.

1
Anton 23 Dez. 2015 im 14:37

Ich bin nicht sicher, warum Sie diese when haben

        WHEN (Sigle IS NULL OR Sigle = '')
            AND (Enseigne IS NULL OR Enseigne ='')
            THEN '' -- ok

Was Sie wollen, ist, dass SigleEnseigne1 NULL und '' ist, wenn Single NULL oder '' ist. Benötigen Sie dieses when nicht stattdessen?

WHEN (Sigle IS NULL OR Sigle = '') THEN ''

Es kann auch das Problem geben, dass Single nicht die leere Zeichenfolge ist und Leerzeichen enthält. Sie können die Funktionen LTRIM() und RTRIM() verwenden

1
worm318 23 Dez. 2015 im 14:47