ORA-01722:将值从内部选择查询传递到顶部选择查询

时间:2018-03-07 12:14:01

标签: oracle oracle11g

对于ISBN [' 9780495809135']如果CATEGORY_EXISTS列返回为1234,3454,则查询将丢失到error.if它返回单行然后它不抛出错误。

我想在最顶层的查询中写下如果CATEGORY_EXISTS ='未找到类别'然后FILE_NAME列应显示为未找到的文件'否则传递CATEGORY_EXISTS值,逗号分隔为最顶层的查询。

请注意,这只是pseduo查询,在实际查询中很多其他表和联接都在那里,

ORA-01722:无效的号码 01722. 00000 - "无效数字" *原因:指定的号码无效。 *操作:指定有效数字。

SELECT ISBN ,
  (SELECT LISTAGG(ANP.FILE_NAME, ',') WITHIN GROUP (
  ORDER BY ANP.FILE_NAME)
  FROM TABLE1 T
  WHERE T.NODE_ID IN( CATEGORY_EXISTS)
  )FILE_NAME
FROM
  (SELECT ISBN,
    (SELECT (
      CASE
        WHEN COUNT(DISTINCT AN.ID) > 0
        THEN LISTAGG(AN.ID, ',') WITHIN GROUP (
        ORDER BY AN.ID)
        ELSE 'Category Not Found'
      END )
    FROM TABLE1 aca
    JOIN TABLE2 AN
    ON ACA.CHILD_NODE_ID=AN.ID
    WHERE PARENT_NODE_ID=GT_CHILD_NODE_ID
    ) CATEGORY_EXISTS
  FROM
    (SELECT ISBN,
      (SELECT ID FROM TEMP_CHILD_ASSOC ac WHERE CHILD_NODE_NAME=GT.ISBN
      ) GT_CHILD_NODE_ID
    FROM MAIN_TABLE GT
    WHERE ISBN='9780495809135'
    )
  ); 

1 个答案:

答案 0 :(得分:1)

node.pivot = SCNMatrix4Rotate(node.pivot, Float.pi, 0, 1, 0) 函数生成一串逗号分隔值(如果有多个ID)。 case表达式为您提供了生成的字符串,固定文本文字(如果没有ID)。然后,您尝试将该字符串与数字进行比较;实际上是其中之一:

listagg()

您隐式将字符串转换为数字,以便将其与WHERE T.NODE_ID IN ('4321') WHERE T.NODE_ID IN ('1234,3454') WHERE T.NODE_ID IN ('Category Not Found') 进行比较。第一个将起作用,因为隐式转换是有效的。第二个将给你ORA-01722(除非你有两个值,你的NLS小数分隔符是逗号;但仍然不会给出匹配),第三个也会给出错误 - 因为那些字符串不能转换为数字。

你可能希望第二个被神奇地视为NODE_ID条款中的两个数字,但这并不是它的工作原理;它获得单个字符串文字,而不是它能理解的实际数字列表。

The IN condition确实接受多个以逗号分隔的表达式的列表,但您传入的是单个字符串。字符串碰巧由逗号分隔值组成的事实是无关紧要的:它本身仍然只是一个表达式。而这无法隐式转换为数字。

如果您拥有或可以创建模式级表类型,如:

IN()

然后您可以使用create type my_number_tab as table of number / 函数将ID转换为集合而不是字符串,然后使用collect()查找匹配项;类似的东西(对你的伪代码有一点解释):

member of

看起来您也可以在内部查询中加入SELECT ISBN , (SELECT LISTAGG(ANP.FILE_NAME, ',') WITHIN GROUP ( ORDER BY ANP.FILE_NAME) FROM TABLE3 ANP WHERE ANP.NODE_ID MEMBER OF CATEGORIES -- use collection )FILE_NAME FROM (SELECT ISBN, (SELECT CAST(COLLECT(AN.ID) AS my_number_tab) -- create collection not string FROM TABLE1 aca JOIN TABLE2 AN ON ACA.CHILD_NODE_ID=AN.ID WHERE PARENT_NODE_ID=GT_CHILD_NODE_ID ) CATEGORIES FROM (SELECT ISBN, (SELECT ID FROM TEMP_CHILD_ASSOC ac WHERE CHILD_NODE_NAME=GT.ISBN ) GT_CHILD_NODE_ID FROM MAIN_TABLE GT WHERE ISBN='9780495809135' ) ); ,因此您可以生成文件名的字符串列表,而不是(或同样)字符串ID列表。但是从伪代码中很难说出来;但也许是这样的:

anp

你可能也可以对左外连接做同样的事情(虽然他们可能都不需要),尽管你的评论暗示你有理由使用子查询:

SELECT ISBN,
  (SELECT (
    CASE
      WHEN COUNT(DISTINCT AN.ID) > 0
      THEN LISTAGG(ANP.FILE_NAME, ',') WITHIN GROUP (
      ORDER BY ANP.FILE_NAME)
      ELSE 'Category Not Found'
    END )
  FROM TABLE1 aca
  JOIN TABLE2 AN
  ON ACA.CHILD_NODE_ID=AN.ID
  JOIN TABLE3 ANP
  ON ANP.NODE_ID=AN.ID
  WHERE ACA.PARENT_NODE_ID=GT_CHILD_NODE_ID
  ) FILE_NAME
FROM
  (SELECT ISBN,
    (SELECT ID FROM TEMP_CHILD_ASSOC ac WHERE CHILD_NODE_NAME=GT.ISBN
    ) GT_CHILD_NODE_ID
  FROM MAIN_TABLE GT
  WHERE ISBN='9780495809135'
);

或类似的东西;再次很难从伪代码中辨别出来......