gpt4 book ai didi

sql - 在查询中查找 SQL 表

转载 作者:行者123 更新时间:2023-11-29 12:23:44 24 4
gpt4 key购买 nike

我有一个 SQL 查询作为 string。我需要声明一个执行以下操作的函数:

  1. 将 SQL 查询(上面提到的)作为参数

  2. 将另一个字符串作为参数(我们称之为table_name)

我想做的是检查 SQL 查询中是否使用了名称为 table_name 的表。您可能猜到了,我不能简单地使用字符串比较,因为我们不能确定。例如,另一个表中有一列的名称也是 table_name。所以问题是,我如何解析 SQL 查询以找到其中使用了哪些表? 任何帮助将不胜感激。

最佳答案

尽管根据实际 PostgreSQL 语法规则(可能在未来发展......)在语法上分析查询的答案显而易见(且难以实现)。

也许您可以(如果您实际上能够查询该数据库)针对 explain 的输出进行测试(WITHOUT analyze ) 命令在该查询上更容易检测对该表的访问。

简单(但远非完整的示例:您应该调查一些解释可能提及表访问的所有可能方式):

test=# create table foo (id serial, foo text);
CREATE TABLE
test=# explain select * from foo;
QUERY PLAN
--------------------------------------------------------
Seq Scan on foo (cost=0.00..22.70 rows=1270 width=36)
(1 row)

test=# explain insert into foo (foo) values ('test');
QUERY PLAN
--------------------------------------------------
Insert on foo (cost=0.00..0.01 rows=1 width=36)
-> Result (cost=0.00..0.01 rows=1 width=36)
(2 rows)

test=# select * from foo;
id | foo
----+-----
(0 rows)

更新:

正如@unutbu 在他的评论中指出的(我不知道)我们可以获得 JSON 格式的 analyze 输出,这样更容易选择关系:

test=# explain (format json) insert into foo (foo) values ('test');
QUERY PLAN
--------------------------------------------
[ +
{ +
"Plan": { +
"Node Type": "ModifyTable", +
"Operation": "Insert", +
"Parallel Aware": false, +
"Relation Name": "foo", +
"Alias": "foo", +
"Startup Cost": 0.00, +
"Total Cost": 0.01, +
"Plan Rows": 1, +
"Plan Width": 36, +
"Plans": [ +
{ +
"Node Type": "Result", +
"Parent Relationship": "Member",+
"Parallel Aware": false, +
"Startup Cost": 0.00, +
"Total Cost": 0.01, +
"Plan Rows": 1, +
"Plan Width": 36 +
} +
] +
} +
} +
]
(1 row)

关于sql - 在查询中查找 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54404624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com