考虑这三个sql语句:

SELECT * FROM Users;

DELETE FROM Users WHERE id =1;

UPDATE Users SET name='test' WHERE id= 1;

现在我不太擅长REGEX,但我想从postgres查询中获取表名。有人能给我做一个解释吗。
谢谢,

最佳答案

对于那些简单的查询,下面的内容就足够了。但是,请注意,如果有子查询,或者UPDATE语句不是以单词UPDATE开头(例如,在头中有注释,或者UPDATE是CTE的一部分时),则它将不起作用。

WITH stmts(_sql) AS (values ('SELECT * FROM Users1;'::text), ('DELETE FROM Users2 WHERE id =1;'), ('UPDATE Users3 SET name=''test'' WHERE id= 1;'))
SELECT _sql, (regexp_matches(_sql, CASE WHEN _sql ~* '^\s*update' THEN '^\s*update' ELSE 'from' END||'\s+([^\s;]+)', 'im'))[1]
FROM stmts

Tablename可以从后面的UPDATE作为第一条语句获得,也可以在第一条from语句之后立即获得。匹配项不区分大小写(i)和多行(m)。

10-04 15:07
查看更多