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

标签 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;

然后我试图删除所有调用的函数:

  • 测试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/

相关文章:

mysql - 对多个表进行 SELECT 查询

mysql - 如何以更好的方式重写这个嵌套查询?

sql - 比较字符串,如果它在 Sql Server 2008 中为 NULL

javascript - 正则表达式的拆分字符串在 javascript 中不能正常工作

java - 如果以字符开头,则正则表达式不匹配

regex - 在 awk 中打印 "<"和 ">"之间的文本

MySQL查询错误

regex - Google Analytics(分析) View 过滤器模式与根目录不匹配

awk - 使用 awk 进行 vlookup : how to match groups/patterns with ids

java - 流程和流程构建器