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

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得需求,具体用那种,看实际需求;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值