【问题标题】:How could I delete sql functions format in awk?如何在 awk 中删除 sql 函数格式?
【发布时间】: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... 但这不会很强大

标签: sql regex awk


【解决方案1】:

您可以将函数的名称重命名为内置函数COALESCE,同时保留括号() 和用户函数的其他参数。 它会产生相同的结果,而不是语法上的,但它会以相同的方式工作除非内置函数不返回NULL 值。这将更容易实现,因为您不必担心刹车。

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

cat file | 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;

【讨论】:

  • 这个test2(MAX(MYFIELD), 4), 会产生问题,因为它会减少到(MAX(MYFIELD), 4),,不是吗?
  • 是的,你是对的,当然。好的...我会想办法解决的
  • 如果您不携带可能由内置函数返回的 NULL 值,您可以将用户函数更改为内置函数 COALESCE,它返回第一个非 NULL 值.然后你不必去删除其余的参数。 cat file | sed 's#\(test1\|test2\|func1\|func2\)(#COALESCE(#g'
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 2017-06-02
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
相关资源
最近更新 更多