如何避免空值

时间:2011-12-25 09:42:06

标签: sql sql-server sql-server-2000

如何避免空值......

表1

ID Value1 Value2

001 Rajan  null
001 Vijayan null
001 null ravi
001 null sudeep
002 kumar null
002 null venkat
.....

我不想显示空值。

预期产出

 ID Value1 Value2

    001 Rajan  ravi
    001 Vijayan sudeep
    002 kumar venkat
    .....

如何查询上述条件

需要查询帮助

2 个答案:

答案 0 :(得分:3)

除非您更详细地解释Value1Value2列中的这些值是如何组合在一起的,并且只有“匹配”确实是确定性的,否则您可以执行以下操作:

DECLARE @temp TABLE (ID INT, Value1 VARCHAR(20), Value2 VARCHAR(20))

INSERT INTO @temp
        (ID, Value1, Value2)
VALUES
        (1, 'Rajan', NULL),
        (3, 'Vijayan', NULL),
        (1, NULL, 'Ravi'),
        (3, NULL, 'sudeep'),
        (2, 'kumar', NULL),
        (2, NULL, 'venkat')

SELECT DISTINCT
   ID, 
   (SELECT Value1 FROM @temp t2 WHERE t2.ID = t.ID AND Value1 IS NOT NULL) AS 'Value1',
   (SELECT Value2 FROM @temp t2 WHERE t2.ID = t.ID AND Value2 IS NOT NULL) AS 'Value2'
FROM
   @temp t

这会为ID的每个值提供一行,Value1的非NULL值和Value2的非空值。

但正如你现在的问题所在,这种方法不起作用,因为你有相同ID的多个条目 - 而且没有解释如何将两个单独的值匹配在一起....

因此,就目前情况而言,我会说你的问题没有确定性和适当的解决方案。您需要提供更多信息,以便我们为您找到解决方案。

更新:如果您要更新到SQL Server 2005 或更新版本,您可以执行类似两个嵌套CTE的操作 - 但在这种情况下,您也必须为如何定义一些规则/排序,将ID = 001的两个变体连接在一起.....

类似的东西:

DECLARE @temp TABLE (ID INT, Value1 VARCHAR(20), Value2 VARCHAR(20))

INSERT INTO @temp
        (ID, Value1, Value2)
VALUES
        (1, 'Rajan', NULL),
        (1, 'Vijayan', NULL),
        (1, NULL, 'Ravi'),
        (1, NULL, 'sudeep'),
        (2, 'kumar', NULL),
        (2, NULL, 'venkat')

;WITH Value1CTE AS
(
    SELECT ID, Value1,
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value1) AS 'RowNum'
    FROM @temp
    WHERE Value1 IS NOT NULL
),
Value2CTE AS
(
    SELECT ID, Value2,
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value2) AS 'RowNum'
    FROM @temp
    WHERE Value2 IS NOT NULL
)
SELECT 
   v1.ID, 
    v1.Value1, v2.Value2
FROM
   Value1CTE v1
INNER JOIN 
    Value2CTE v2 ON v1.ID = v2.ID AND v1.RowNum = v2.RowNum

会给你一个可重现的输出:

ID  Value1  Value2
1   Rajan   Ravi
1   Vijayan sudeep
2   kumar   venkat

假设给定两个带有 SAME ID的条目,您希望对ORDER BY的实际值进行排序(例如Rajan Vijayan }和Ravi之前的sudeep - >您将RajanRavi加在一起,以及Vijayansudeep

但是又一次:这是在 SQL Server 2005 而且只是更新 - 在SQL Server 2000中没有等效的,不可原谅的......

答案 1 :(得分:0)

SELECT i1.ID, i2.Value1, i3.Value2
FROM Table1 i1, Table1 i2, Table1 i3
WHERE i1.ID = i2.ID and i1.ID = i3.ID and i2.Value1 IS NOT NULL and i3.Value2 IS NOT NULL;