我怎么能删除awk中的sql函数格式?

时间:2016-11-08 10:03:36

标签: sql regex awk

我有一个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;

然后我试图删除所有名为的函数:

  • TEST1
  • TEST2
  • TEST3
  • func1的
  • 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;

处理这种情况的任何想法或线索?

1 个答案:

答案 0 :(得分:-1)

您可以将函数的名称重命名为内置函数rake assets:precompile ,同时保留brakets COALESCE (和其他用户函数的参数。 它将产生相同的结果,而不是语法,但它将工作相同 UNLESS 内置函数不返回)值。它会更容易实现,因为您不必担心刹车。

如果NULL是您提供的输入,则:

file

将产生:

cat file | sed 's#\(test1\|test2\|func1\|func2\)(#COALESCE(#g'