我试图编写一个语句来检查表是否包含行:
SELECT COUNT(*) FROM $1 ;
如果我想把表名传给:$1
我收到以下错误消息:
在“$1”处或附近出现语法错误
我的陈述怎么了?
最佳答案
你不能用事先准备好的陈述。使用柯克建议的功能。唯一的区别是,选择第一行可能更安全,比如:
t=# create or replace function tempty(tn text) returns boolean as
$$
declare
c int;
begin
execute format('select 1 from %I limit 1',tn) into c;
return NOT coalesce(c,0) > 0;
end;
$$ language plpgsql
;
CREATE FUNCTION
t=# create table empty(i int);
CREATE TABLE
t=# select tempty('empty');
tempty
--------
t
(1 row)
t=# select tempty('pg_class');
tempty
--------
f
(1 row)
docs do not say直接传递给
execute
prepared语句的值不能是标识符,但在任何地方,它们都是以标识符不能是的方式被提及的,例如:一般计划假定提供给执行的每个值都是
列的不同值和列的值是一致的
分发。
($1是具有或不具有某些属性的列值。)
关于sql - 将表名作为参数传递时,如何检查表是否包含任何行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46520221/