考虑这三个 sql 语句:
SELECT * FROM Users;
DELETE FROM Users WHERE id =1;
UPDATE Users SET name='test' WHERE id= 1;
现在我不太擅长 REGEX,但我想从 postgres 查询中获取表名。有人可以为我创建一个并稍微解释一下吗。
谢谢,
最佳答案
对于那些简单的查询,以下内容就足够了。但是,请注意,当存在子查询或 UPDATE 语句不以单词 UPDATE 开头时(例如 header 中有注释或 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)。
关于PHP:使用 REGEX 从任何查询中获取表名(选择、更新、插入、删除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38177162/