ORA-00909:使用NVL时参数数目无效

时间:2019-06-04 05:40:00

标签: sql plsql oracle-sqldeveloper

我有一列获取具体金额的列,条件如下。

我尝试了这个以获得他的特定值,但是我得到了多行,应该是单行。

select distinct
(case 
    when aila.line_type_lookup_code = 'ITEM' and aila.tax_classification_code = 'VAT12 SERVICES' then to_char(aila.assessable_value) else '0'
end) as taxable_lines
from
ap_invoice_lines_all aila

where
aila.invoice_id = '31004'

然后我尝试用这个替换空值。

select distinct
(case
    when aila.line_type_lookup_code = 'ITEM' and aila.tax_classification_code = 'VAT12 SERVICES' then nvl(to_char(aila.assessable_value,0)) end) as taxable_lines

from
ap_invoice_lines_all aila

where
aila.invoice_id = '31004'

例如,我有一个名为ap_invoice_lines_all的表,该表具有列名

line_type_lookup_code   string
tax_classification_code  string
assessable_value         double

然后基于上面的查询,我想要的预期输出是

taxable lines
1300

但是我得到的是

taxable lines
0
1300

如何删除结果中的0? 谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您使用的是to_char错误。在这种情况下,该函数应仅具有一个参数:

nvl(to_char(aila.assessable_value,0))

应该是

nvl(to_char(aila.assessable_value),0)

我建议不要在这样的简单查询中使用这样的case表达式来提高可读性。案例表达式是很好的工具,但通常会降低查询的可读性。在这种情况下,您实际上并不需要IF..THEN..ELSE函数(这是使用case表达式的原因)。

第二,您确定只有aila.invoice_id = '31004'处有记录吗?如果该子句为true的表中实际上有两行,则查询将仅返回两行。在这种情况下,它将找到assessable_value为空的一行,而不是其中一行。

无论如何,要从结果集中删除零(在这种情况下为空值),只需执行以下操作:

select distinct aila.assessable_value as taxable_lines
from   ap_invoice_lines_all aila
where  aila.invoice_id              = '31004'
and    aila.line_type_lookup_code   = 'ITEM'           -- Originally a condition in the case statement
and    aila.tax_classification_code = 'VAT12 SERVICES' -- Originally a condition in the case statement
and    aila.assessable_value is not null;              -- Removes any null values from the result

或者如果您希望将null值替换为零;

select distinct nvl(aila.assessable_value, 0) as taxable_lines 
from   ap_invoice_lines_all aila
where  aila.invoice_id              = '31004'
and    aila.line_type_lookup_code   = 'ITEM'           -- Originally a condition in the case statement
and    aila.tax_classification_code = 'VAT12 SERVICES' -- Originally a condition in the case statement

请注意,如果可能存在多行,则distinct子句将把assessable_value处的所有行分组为单个行。如果希望所有distinct为空的行都显示为assessable_value,则删除0子句。

最后,如果不应存在重复的ID,则可能要考虑在invoice_id上实现主键(如果表没有一个)或唯一索引。对于查询中经常使用的ID列,这样做应该是唯一的好习惯。