我有一个看起来像这样的 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
- 功能2
但保留 AVG、MAX、UPPER、SUBSTR... 和所有 native 函数。
所以期望的输出将是:
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;
处理这种情况的任何想法或线索?
最佳答案
您可以将函数的名称重命名为内置函数COALESCE
,同时保留括号(
)
和用户函数的其他参数.
它会产生相同的结果,但语法上不同,但它的工作方式相同除非内置函数不返回NULL
值。这将更容易实现,因为您不必担心刹车片。
如果 file
是您提供的输入,则:
cat 文件 | sed 's#\(test1\|test2\|func1\|func2\)(#COALESCE(#g'
将产生:
SELECT COALESCE(COALESCE(MYFIELD)),
COALESCE(MAX(MYFIELD), 4),
AVG(COALESCE(COALESCE(MYFIELD, COALESCE(4)))),
COALESCE(UPPER("stack"))
FROM MYTABLE;
关于sql - 我怎么能删除 awk 中的 sql 函数格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40484000/