CASE与OR相结合的问题

时间:2015-12-23 14:09:46

标签: sql sql-server tsql if-statement case

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

代码很简单。

问题在于第三个when,如下所示

enter image description here

我的第4和第5行应该没有任何内容,但却给了我Sigle :

我想要的是让第4行和第5行的列SigleEnseigne1为空

感谢您的见解

5 个答案:

答案 0 :(得分:3)

试试这个:

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

答案 1 :(得分:2)

除了明确指出(TRUE OR FALSE) = TRUE 我会使用ISNULL()LEN()来简化和防范代码。

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

如果这些字段包含空格,您的代码会如何反应? LEN会自动修剪尾随空格。

答案 2 :(得分:1)

此行导致您的问题:

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

...但这只是显而易见的,因为你声明你不想要这个结果。除此之外,代码按预期行事。

最简单的解决方案是取出:

  'Sigle : ' + Sigle 

但这可能是也可能不是您正在寻找的。基于给定的信息,它是解决方案,但没有大量的信息可以解决

如果您要尝试打印非空值,则它应该是AND而不是OR。当你使用OR时,如果EITHER条件为真,它将返回true。

答案 3 :(得分:1)

我不确定你为什么要这个when

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

正如您想要的那样SigleEnseigne1为NULL''当Sigle为NULL''时,您需要此when代替

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

还有一个问题,Sigle不是空字符串并且有空格。您可以使用LTRIM()RTRIM()函数

答案 4 :(得分:0)

我花了整个周末,但实际上,我发现了我的错误。

抱歉这个烂摊子

答案如下:

 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 (Sigle IS NOT NULL OR Sigle <> '') AND (Enseigne IS NULL OR Enseigne = '') 
             THEN 'Sigle : ' + RTrim(LTrim(Sigle))
         WHEN (Sigle IS NULL OR Sigle = '') AND (Enseigne IS NOT NULL OR Enseigne <> '') 
             THEN ''
         WHEN
             (Sigle IS NOT NULL OR Sigle <> '') AND (Enseigne IS NOT NULL OR Enseigne <> '') 
             THEN 'Sigle / Enseigne : ' + IsNull( RTrim(LTrim(Sigle)), '' ) + ' / ' + Enseigne
     END as SigleEnseigne1
     FROM    John_Jack

今年结束了