【发布时间】:2017-03-15 22:16:38
【问题描述】:
我的 sql 查询有问题,不知道如何解决:
输出表由。
1. SERIALNR VARCHAR(26) NOT NULL
2. LP_BASIC VARCHAR(20) NOT NULL
3. LP_NEW VARCHAR(20)
4. SCORE NUMBER(20) NOT NULL
5. CURRENT_LP VARCHAR(20)
查询本身运行良好,没有错误。
LP_BASIC 列始终被填充,而 LP_NEW 是可选字段。 CURRENT_LP 应始终显示 LP_NEW(如果不为空),否则为 LP_BASIC(永远不为空)。
问题是,“ELSE f.LP_BASIC”部分不起作用。 如果没有找到 LP_NEW 记录,它应该返回 LP_BASIC 值,但它只返回一个空字段。
SELECT
f.SERIALNR,
f.LP_BASIC,
f.LP_NEW,
f.SCORE,
CASE
WHEN
f.LP_NEW
IS NOT NULL
THEN
f.LP_NEW
ELSE
f.LP_BASIC
END
AS CURRENT_LP
FROM (
SELECT
SERIALNR,
MAX(SCORE) MAX_ID
FROM
EAPS.PS_TC_SM
GROUP BY
SERIALNR
) x
INNER JOIN
EAPS.PS_TC_SM f
ON
f.SERIALNR=
x.SERIALNR
AND
f.SCORE =
x.MAX_ID
感谢任何帮助。
提前谢谢你。
罗伯。
更新(已解决)
LP_NEW 列不为空,其中有一个空格字符,因此“IS NULL”不起作用。
【问题讨论】:
-
请发布一些示例数据、所需结果以及您从查询中得到的结果
-
这不是更容易阅读吗?
coalesce(f.LP_NEW ,f.LP_BASIC) -
@Kritner
Coalesce更好。Nvl比较两个值,coalesce在找到值后立即停止。 -
你确定 lp_new 实际上是空的,而且里面没有空格吗?
-
我倾向于同意 DCookie,并预测
NVL()和COALESCE()都无法解决问题。如果NVL()或COALESCE()会修复任何CASE的错误,那将是非常奇怪的,因为它们在逻辑上是等价的——在实现上的差异使得CASE和COALESCE()比NVL()快一点一些情况。