我试图编写一个语句来检查表是否包含行:

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直接传递给executeprepared语句的值不能是标识符,但在任何地方,它们都是以标识符不能是的方式被提及的,例如:
一般计划假定提供给执行的每个值都是
列的不同值和列的值是一致的
分发。
($1是具有或不具有某些属性的列值。)

关于sql - 将表名作为参数传递时,如何检查表是否包含任何行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46520221/

10-12 05:35