解码得到ORA-00938错误

时间:2014-09-11 17:25:58

标签: oracle oracle11g

我当前的SQL如下:

CASE
    WHEN PARENT.ASLNO IS NULL THEN SUBCATEGORIES.SUBCATEGORY_LIST
    -- #5098
    ELSE DECODE(ASL.CATEGORY_NAME, null,
      NVL(SUBCATEGORIES.SUBCATEGORY_LIST,
        SUBCATEGORIES_PARENT.SUBCATEGORY_LIST),
      decode(SUBCATEGORIES.SUBCATEGORY_LIST,null,null,'N/A'))
    -- End #5098
END AS SUPSPD_SUBCATEGORY_LIST

我正在尝试更改以下sql

DECODE(ASL.CATEGORY_NAME, null,
  NVL(SUBCATEGORIES.SUBCATEGORY_LIST,
    SUBCATEGORIES_PARENT.SUBCATEGORY_LIST),
  decode(SUBCATEGORIES.SUBCATEGORY_LIST,null,null,'N/A'))

DECODE(ASL.CATEGORY_NAME, null,
  DECODE(SUBCATEGORIES.SUBCATEGORY_LIST,
    SUBCATEGORIES_PARENT.SUBCATEGORY_LIST),
  decode(SUBCATEGORIES.SUBCATEGORY_LIST,null,null,'N/A'))

但我得到ORA-00938没有足够的功能参数?

2 个答案:

答案 0 :(得分:2)

此:

  NVL(SUBCATEGORIES.SUBCATEGORY_LIST,
    SUBCATEGORIES_PARENT.SUBCATEGORY_LIST)
如果子元素为空,

返回父子类别列表。

解码需要at least three arguments m,但您只提供了两个;您有第一个search值但没有结果,也没有default,这意味着您不会总是得到一个值。

你的NVL的等价物是:

  DECODE(SUBCATEGORIES.SUBCATEGORY_LIST, NULL,
    SUBCATEGORIES_PARENT.SUBCATEGORY_LIST, SUBCATEGORIES.SUBCATEGORY_LIS),

我不确定为什么你想让声明变得更长,更难以理解...为了某些一致性,我甚至可能想要改变

  decode(SUBCATEGORIES.SUBCATEGORY_LIST,null,null,'N/A')

  NVL2(SUBCATEGORIES.SUBCATEGORY_LIST, 'N/A', null)

答案 1 :(得分:1)

您已更改:

NVL(SUBCATEGORIES.SUBCATEGORY_LIST, SUBCATEGORIES_PARENT.SUBCATEGORY_LIST)

为:

DECODE(SUBCATEGORIES.SUBCATEGORY_LIST, SUBCATEGORIES_PARENT.SUBCATEGORY_LIST)

DECODE需要至少3个参数。

<强>除了

我发现通过像其他任何代码一样很好地调整复杂表达式来调试这样的复杂表达式要容易得多:

DECODE( ASL.CATEGORY_NAME
      , null
      , DECODE ( SUBCATEGORIES.SUBCATEGORY_LIST
               , SUBCATEGORIES_PARENT.SUBCATEGORY_LIST
               )
      , decode ( SUBCATEGORIES.SUBCATEGORY_LIST
               , null
               , null
               , 'N/A'
               )
      )