如何用空字符串替换空字段值?
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;
我需要用空白字符串替换“估计数字”字段中的空值。我已经尝试了下面的代码,但值仍然显示为 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;