postgresql 在某个记录中查找满足条件的字段 findfield

最近,在一个Insert SQL时报字段长度不够,但又没指出哪个字段,表的字段数很多,看了好久都没找出是哪个字段,心想有什么办法能按指定条件过滤当前记录的所有字段不就能找出我想要的字段吗?昨天终于用hstore写出了一个满足需求的函数,特记录如下,备查。

--usage:

-- select * from findfield('select * from sales_orders where id=1000','length(value)>=50 and value ilike ''%car%''');

-- Function: public.findfield(text, text);
-- DROP FUNCTION public.findfield(text, text);

CREATE OR REPLACE FUNCTION public.findfield(
    IN sql text,
    IN  wh text,
    OUT fldname text,
    OUT fldvalue text
    )
  RETURNS SETOF RECORD AS
$BODY$
DECLARE
    sql0 text;
    rec record;
BEGIN
    if sql='' then
        sql := 'select 1 as v';
    end if;
    if wh='' then
        wh := 'false';
    end if;
    sql0 := 'with h as (' || sql ||' ) ';
    sql0 := sql0 || ',h1 as (select hstore(h) v from h)';
    sql0 := sql0 || ',h2 as (select a.key as name,a.value from h1,each(h1.v) a)';
    sql0 := sql0 || 'select * from h2 where ' || wh || ';';
    
    for rec in EXECUTE sql0 loop
        fldname := rec.name;
        fldvalue := rec.value;
        return next;
    end loop;    
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.findfield(text, text)
  OWNER TO root;

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值