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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章