PostgreSQL 执行动态字符串SQL(如python中eval)
在pg中要执行一个动态的查询sql,这个时候需要利用函数来实现此功能,关键词:EXECUTE。
通过EXECUTE关键字在函数中执行sql。示例如下:
需求分析:学生表中有三个attr字段,学生的备注信息可能存在于其中某一个字段中(具体在哪存储对应信息,这里不多解释),然后根据字段名称去查询记录中学生对应得备注信息。
1. 创建students表并准备测试数据:
CREATE TABLE "public"."students" (
"name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"code" varchar(255) COLLATE "pg_catalog"."default",
"age" int4,
"attr_1" varchar(255) COLLATE "pg_catalog"."default",
"attr_2" varchar(255) COLLATE "pg_catalog"."default",
"attr_3" varchar(255) COLLATE "pg_catalog"."default"
);
INSERT INTO "public"."students" VALUES ('张三', 'S101', 21, '不说话', NULL, NULL);
INSERT INTO "public"."students" VALUES ('李四', 'S102', 22, NULL, '不会笑', NULL);
INSERT INTO "public"."students" VALUES ('王五', 'S103', 23, NULL, NULL, '话贼多');
2. 创建一个存储过程用于执行动态sql:
第一种方式:把要查询得变量作为参数传给函数,然后再函数内部进行动态sql拼接,这种方式适合再直接select查询时进行调用。
CREATE OR REPLACE FUNCTION cux_student_search ( student_name VARCHAR, COLUMN_NAME VARCHAR )
RETURNS VARCHAR AS $$
DECLARE t_note VARCHAR;
BEGIN
EXECUTE format ( 'SELECT %s FROM students where name=''%s''', COLUMN_NAME, student_name )
INTO t_note;
RETURN t_note;
END;
$$ LANGUAGE plpgsql;
测试sql:
SELECT cux_student_search('张三', 'attr_1');
SELECT cux_student_search('李四', 'attr_2');
SELECT cux_student_search('王五', 'attr_3');
第二种方式:把要查执行得sql作为参数传给函数,然后在函数内直接使用EXECUTE执行sql,这种方式适合单次或者调用前可以方便将sql进行拼接整合后进行调用。
CREATE OR REPLACE FUNCTION cux_student_search_2 (sql_expression VARCHAR)
RETURNS VARCHAR AS $$
DECLARE t_note VARCHAR;
BEGIN
EXECUTE sql_expression INTO t_note;
RETURN t_note;
END;
$$ LANGUAGE plpgsql;
测试sql:
SELECT cux_student_search_2('SELECT attr_1 FROM students where name=''张三''');
SELECT cux_student_search_2('SELECT attr_2 FROM students where name=''李四''');
SELECT cux_student_search_2('SELECT attr_3 FROM students where name=''王五''');
两种方式都可以实现执行动态sql得需求,具体用那种,看实际需求;