PostgreSQL中字符串SQL(如 eval)执行查询

PostgreSQL 中字符串SQL(如 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, '话贼多');

PostgreSQL中字符串SQL(如 eval)执行查询_第1张图片

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');

PostgreSQL中字符串SQL(如 eval)执行查询_第2张图片
第二种方式:把要查执行得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=''王五''');

PostgreSQL中字符串SQL(如 eval)执行查询_第3张图片
两种方式都可以实现执行动态sql得需求,具体用那种,看实际需求;

你可能感兴趣的:(PostgreSQL,postgresql,sql,数据库)