【问题标题】:ORA-00909: invalid number of arguments when using NVLORA-00909: 使用 NVL 时参数数量无效
【发布时间】:2019-06-04 05:40:00
【问题描述】:

我有一列可以获取具有如下条件的特定金额。

我试过这个来获取他的具体值,但我得到了多行,它应该是单行。

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? 谢谢!

【问题讨论】:

  • 问题不在于情况,而在于您的选择。如果表中有两条记录为invoice_id = '31004',那么您将得到两行结果。
  • nvl 总是需要 2 个参数 NVL( string1, replace_with )
  • 嗨@hotfix 当我尝试选择条件时,它只变成1行。但我需要将此作为条件的子查询。
  • 我尝试了 NVL(assessable_value, 0) 但我得到错误无效参数数量
  • 你得到多少行select * from.. where aila.invoice_id = '31004' ?你得到无效的数字异常,因为你的参数有不同的类型

标签: sql plsql oracle-sqldeveloper


【解决方案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'的记录吗?如果该子句为真的表中实际上有两行,则该查询将仅返回两行。在这种情况下,它会找到 assessable_value 为 null 的行和不为 null 的行。

在任何情况下,要从结果集中删除零(或者在这种情况下为空值),您可以简单地执行以下操作:

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

或者如果你想用零替换空值;

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 所在的所有行在可能存在多行的情况下被分组为一行。如果您希望assessable_value 为空的所有行在结果中显示为0,请删除distinct 子句。

最后,您可能需要考虑在invoice_id 上实现主键(如果表没有主键)或唯一索引,如果不应该有重复的 id。对于经常在查询中使用并且应该是唯一的 ID 列,这样做是一种很好的做法。

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 2022-01-02
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多