考虑以下三个sql语句:
SELECT * FROM Users;
DELETE FROM Users WHERE id =1;
UPDATE Users SET name='test' WHERE id= 1;
现在我不是很擅长REGEX,但我想从postgres查询中获取表名。有人可能会为我做一个解释。
谢谢,
答案 0 :(得分:0)
对于那些简单的查询,以下就足够了。但是,请注意,当存在子查询时它不起作用,或者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)。