如何用空字符串替换空字段值?

How to replace null field values with an empty string?

我需要用空白字符串替换“估计数字”字段中的空值。我已经尝试了下面的代码,但值仍然显示为 null。有什么想法吗?谢谢

Pro Number      Estimate Number

10271943        NULL
10271944        NULL
10271945        NULL
10271946        NULL
10271948        94606


SELECT a.AAAREFNUMVALUE AS "Pro Number",
    (SELECT TOP 1 isnull(a2.AAAREFNUMVALUE,'') 
    FROM dbo.AAATOREFNUMS a2
    WHERE a2.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND 
    a2.AAAREFNUMTYPE = 4 
    ORDER BY a2.AAAREFNUMVALUE
    ) AS "Estimate Number"

FROM dbo.AAATOREFNUMS a 
INNER JOIN dbo.AAATODATES d ON a.AAATRANSPORTTABLE = d.AAATRANSPORTTABLE

WHERE a.AAAREFNUMTYPE = 1 AND d.AAADATETYPE = 1  
GROUP BY a.AAAREFNUMVALUE,a.AAATRANSPORTTABLE,a.AAAREFNUMTYPE;

当子查询returns没有值时出现问题。 isnull() 需要 子查询之外:

ISNULL( (SELECT TOP 1 a2.AAAREFNUMVALUE
         FROM dbo.AAATOREFNUMS a2
         WHERE a2.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND 
               a2.AAAREFNUMTYPE = 4 
         ORDER BY a2.AAAREFNUMVALUE
        ), ''
      ) AS "Estimate Number"

请注意,在这种情况下,ISNULL() 优于 COALESCE(),因为 COALESCE() 的 SQL 服务器实现对第一个参数求值两次,而实际上它不是NULL.

但是,如果您改用 window 函数,您可能会发现查询更容易表达并且更快 运行:

SELECT DISTINCT a.AAAREFNUMVALUE AS "Pro Number",
       COALESCE(a.AAAREFNUMVALUE_4, '') as "Estimate Number"
FROM (SELECT a.*,
             MAX(CASE WHEN a.AAAREFNUMTYPE = 4 THEN a.AAAREFNUMVALUE END) OVER (PARTITION BY a.AAATRANSPORTTABLE) as AAAREFNUMVALUE_4
      FROM dbo.AAATOREFNUMS a
     ) a INNER JOIN
     dbo.AAATODATES d
     ON a.AAATRANSPORTTABLE = d.AAATRANSPORTTABLE
WHERE a.AAAREFNUMTYPE = 1 AND d.AAADATETYPE = 1  ;

试用案例,调整一下:

CASE 
(SELECT TOP 1 a2.AAAREFNUMVALUE
    FROM dbo.AAATOREFNUMS a2
    WHERE a2.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND 
    a2.AAAREFNUMTYPE = 4 
    ORDER BY a2.AAAREFNUMVALUE) as Estimate Number
  WHEN NULL THEN ''
  ELSE 
    a2.AAAREFNUMVALUE
END as "Estimate Number"

你可以试试这个。

SELECT a.AAAREFNUMVALUE AS "Pro Number",
    ISNULL((SELECT TOP 1 isnull(a2.AAAREFNUMVALUE,'') 
    FROM dbo.AAATOREFNUMS a2
    WHERE a2.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND 
    a2.AAAREFNUMTYPE = 4 
    ORDER BY a2.AAAREFNUMVALUE
    ),'') AS "Estimate Number"

FROM dbo.AAATOREFNUMS a 
INNER JOIN dbo.AAATODATES d ON a.AAATRANSPORTTABLE = d.AAATRANSPORTTABLE

WHERE a.AAAREFNUMTYPE = 1 AND d.AAADATETYPE = 1  
GROUP BY a.AAAREFNUMVALUE,a.AAATRANSPORTTABLE,a.AAAREFNUMTYPE;