【发布时间】:2017-03-21 21:46:48
【问题描述】:
我有一个如下所示的 sql 查询:
SELECT test1(func1(MYFIELD)),
test2(MAX(MYFIELD), LOWER("NOPE")),
test3(MAX(MYFIELD), 1234),
AVG(test1(test2(MYFIELD, func1(4)))),
func2(UPPER("stack"))
SUBSTR(MYFIELD, 2, 4),
test2(MIN(MYFIELD), SUBSTR(LOWER(UPPER("NOPE")), 1, 7)),
SUBSTR('func1(', 2, 4)
FROM MYTABLE;
然后我试图删除所有调用的函数:
- 测试1
- 测试2
- 测试3
- 功能1
- func2
但保留AVG、MAX、UPPER、SUBSTR...和所有原生函数。
所以期望的输出是:
SELECT MYFIELD,
MAX(MYFIELD),
MAX(MYFIELD),
AVG(MYFIELD),
UPPER("stack")
SUBSTR(MYFIELD, 2, 4),
MIN(MYFIELD)
SUBSTR('func1(', 2, 4)
FROM MYTABLE;
我想删除第二行的 LOWER,因为它是要删除的函数之一的参数,在本例中为 test2,它有两个参数。那么如果我们删除这个函数,我们也应该删除它的参数。
我已经尝试在 awk 中这样做:
{
print gensub(/(test1|test2|func1|func2)\(/,"","gi", $0);
}
但输出不需要考虑右括号,它也不会删除自定义函数的其余参数:
SELECT MYFIELD)),
MAX(MYFIELD), LOWER("NOPE")),
MAX(MYFIELD), 1234),
AVG(MYFIELD, 4)))),
UPPER("stack"))
SUBSTR(MYFIELD, 2, 4),
MIN(MYFIELD), SUBSTR(LOWER(UPPER("NOPE")), 1, 7)),
SUBSTR('', 2, 4)
FROM MYTABLE;
有处理这种情况的想法或线索吗?
【问题讨论】:
-
为什么预期输出中缺少
, LOWER("NOPE")?删除或不删除test/func中的内容的规则是什么? -
是的,但它是要删除的函数之一的参数,在这种情况下是 test2,它有两个参数。那么如果我们删除这个函数,我们也应该删除它的参数。
-
完成!谢谢你的时间,@Sundeep! :)
-
不,这不是强制性的。例如,我们可以有
test2(MAX(MYFIELD), 1234),。 (我会再次更新主帖)。 -
不,我的解决方案并没有真正意识到嵌套,我在补丁之后添加补丁:P.. 对于最新情况,补丁将是
sed -E 's/(test[123]|func[12])\(([^,]*),[^)]*\)/\2/; :a s/(test[123]|func[12])\(([^)]*)\)/\2/; ta; s/\)\),/),/; s/\),[^)]*\)\),/),/' file... 但这不会很强大