从1个表中提取时,从SQL查询中显示2个不同长度的列

时间:2015-07-16 21:21:34

标签: sql-server sql-server-2014-express

我使用以下代码从我的表中提取数据。

    SELECT 
    CASE WHEN VendorContactLName LIKE '%[s]'
        THEN VendorContactFName + ' ' + VendorContactLName + '''' END AS 'Test',
    CASE WHEN VendorContactLName NOT LIKE '%[s]'
        THEN VendorContactFName + ' ' + VendorContactLName + '''s' END AS 'Test2'
    FROM Vendors;

目前,它会返回2列,但是第一个条件不是真的,它会放置" NULL"在测试列中,如果第二个条件不为真,则在其各自的列中返回NULL。我希望不这样做,而是根据条件是否满足逐步添加行,并避免使用NULL的行。

编辑:不确定它是如何清除的,但是为了直观表示,这就是当前代码会发生的事情。

Test            Test2
NULL            Francesco Alberto's
NULL            Ania Irvin's
NULL            Lukas Liana's
NULL            Kenzie Quinn's
Michelle Marks' NULL
NULL            Anton Mauro's
NULL            Ted Maegen's
NULL            Erick Kaleigh's
NULL            Kaitlyn Anthoni's
NULL            Bill Leigh's
NULL            Kaitlin Hostlery's

我想要的是:

    Test            Test2
Michelle Marks'    Francesco Alberto's
                   Ania Irvin's
                   Lukas Liana's
                   Kenzie Quinn's
                   Anton Mauro's
                   Ted Maegen's
                   Erick Kaleigh's
                   Kaitlyn Anthoni's
                   Bill Leigh's
                   Kaitlin Hostlery's

3 个答案:

答案 0 :(得分:0)

也许你想把它包装成子选择:

SELECT * FROM
(
   Your statement here
)
WHERE Test IS NOT NULL AND Test2 IS NOT NULL

答案 1 :(得分:0)

在这种情况下,使用外部查询过滤掉NULL,如下所示。这里XXX是内联查询结果集的表别名。

SELECT * FROM (
    SELECT 
CASE WHEN VendorContactLName LIKE '%[s]'
    THEN VendorContactFName + ' ' + VendorContactLName + '''' END AS 'Test',
CASE WHEN VendorContactLName NOT LIKE '%[s]'
    THEN VendorContactFName + ' ' + VendorContactLName + '''s' END AS 'Test2'
    FROM Vendors ) XXX
WHERE Test IS NOT NULL AND Test2 IS NOT NULL;

(OR)

使用ISNULL()功能,如

SELECT ISNULL(Test, '') as Test, ISNULL(Test2,'') as Test2 FROM (
    SELECT 
CASE WHEN VendorContactLName LIKE '%[s]'
    THEN VendorContactFName + ' ' + VendorContactLName + '''' END AS 'Test',
CASE WHEN VendorContactLName NOT LIKE '%[s]'
    THEN VendorContactFName + ' ' + VendorContactLName + '''s' END AS 'Test2'
    FROM Vendors ) XXX

答案 2 :(得分:0)

  1. 返回NULL的原因是因为您没有在case语句中指定ELSE子句。 (参见返回类型部分: https://msdn.microsoft.com/en-us/library/ms181765.aspx

    SELECT 
    CASE WHEN VendorContactLName LIKE '%[s]'
        THEN VendorContactFName + ' ' + VendorContactLName + ''''
        ELSE 'Value' 
    END AS 'Test',
    CASE WHEN VendorContactLName NOT LIKE '%[s]'
        THEN VendorContactFName + ' ' + VendorContactLName + '''s'
        ELSE 'Value'
    END AS 'Test2'
    FROM Vendors;
  2. 即使您避免在错误评估中返回NULL,您可能会遇到的另一个问题是您正在构建一个包含两个不相关列的表并将它们设置为彼此相等。
    而不是生成具有不匹配列长度的表,将插入Null值以确保列长度相等:

    #   Test    Test2
    1 Foo Thing1
    2 Thing2 Bar
    3 Smith NULL
    4 Value NULL

    在这种情况下,IsNull()会将返回的NULL值设置为指定值,但可能不会提供任何额外的好处。

    < / LI>