对于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'
)
);
答案 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'
);
或类似的东西;再次很难从伪代码中辨别出来......