【发布时间】:2020-08-08 11:05:07
【问题描述】:
我正在使用 sed 编写基于正则表达式的 SQL 查询“转换器”,从 ms-access 到 MySQL 或 MariaDB SQL。
我的问题是nz函数,它有两种形式:
access MariaDB or MySQL
nz(expr1,expr2) --> ifnull(expr1,expr2)
nz(expr) --> ifnull(expr,0)
我对每种情况都有这两个陈述,但不是两个都只有一个:
sed -E 's/nz\((.*),(.*)\)/ifnull\(\1,\2\)/gi'
sed -E 's/nz\((.*)\)/ifnull\(\1,0\)/gi'
您知道如何将两者合并到一个 sed 语句中吗?或者可能使用其他工具,如 tr、awk 或 perl?
更新
对于这个输入:
SELECT nz(column1),nz(column2,4),column3 FROM table;
想要的输出是:
SELECT ifnull(column1,0),ifnull(column2,4),column3 FROM table;
【问题讨论】:
-
即使第一个语句本身看起来也不正确。您可能认为的
expr2可能包含逗号,然后您的模式中的第一个(.*)将延伸到expr2中的最后一个逗号。您将错误识别expr1和expr2。这可以修复(第一个子表达式应该是([^,]*),但我确信还有许多其他陷阱。例如,expr2可能是(或包含)对nz的另一个调用。您是否正在编写一个可以处理的解决方案有那种嵌套调用? -
不幸的是,我糟糕的解决方案无法处理这样的嵌套调用。它实际上包含一系列加入的 sed 调用。感谢您的评论。