enter code here
我正在构建一组基于参数和内部选择返回json字符串的函数。
我遇到的问题是因为我在pl / sql中循环游标,构建json的结构,它在最后一个节点的末尾添加了一个额外的逗号。
它正确解析但是由于额外的逗号,json的html eval失败了。是否可以删除pl / sql中的特定字符(比如字符串中的最后一个逗号)。我查看了REPLACE,但是我找不到使用REPLACE和特定字符实例的文档。
循环看起来像:
FOR appGroup IN appGroups
LOOP
tsResults := tsResults || ' "Group" : { ';
tsResults := tsResults || ' "Id" : "' || appGroup.group_id || '", ';
tsResults := tsResults || '"Name" : "' || appGroupd.display_name || '" ';
tsResults := tsResults || ' }, ';
END LOOP;
这是最后一行中最后一个逗号给我带来悲伤的逗号。
有没有办法杀死最后一个没有抓取它之前的所有字符串字符,以及它之后的所有字符并将它们组合在一起?
关于如何解决这个问题的任何建议都将非常感激。
更新
使用Cybernate的答案我能够进行一些更改以使其正常工作......最初是在END LOOP之后立即进行的;我有额外的代码在结果字符串中添加更多:
tsResults := tsResults || '}] }';
正确终止了我正在处理的群组数组......
我在该行之前放置了以下代码:
tiLastComma := INSTR(tsResults, ',', -1);
tsResults := SUBSTR(tsResults, 1, tiLastComma - 1);
现在json正确终止,并且在与jquery一起使用时可以正确判断。
答案 0 :(得分:6)
您可以使用INSTR函数查找“,”的最后一次出现的位置,然后使用SUBSTRING。
SELECT SUBSTR(tsResults , 1, INSTR(tsResults , ',', -1)-1)
INTO tsResults
FROM dual;
如果您认为正则表达式不适用于此,请在PL / SQL中使用此语句:
SELECT REGEXP_REPLACE(tsResults , '\s*,\s*$', '')
INTO tsResults
FROM dual;
答案 1 :(得分:4)
更容易使用rtrim
功能。所以在循环之后:
tsResults := rtrim( tsResults, ',' );
然后要终止JSON,请在同一语句中添加结束花括号:
tsResults := rtrim( tsResults, ',' ) || '}';
答案 2 :(得分:0)
Tobi,我有类似的情况,但请记住使用RTRIM它会删除你在函数中规定的值的所有实例。
例如:
我想从列选择的末尾修剪'X'。 (仅限最后一次)
列值='SOMEVALUEXX'
现在RTrim将返回:'SOMEVALUE'
你有可能在='SOMEVALUEX'
之后Chandu的回答是正确的。
始终检查您的业务流程。