• 关于JSON 字段数据的直接查询


    最新的pgSQL 对json的支持在进一步加强!虽然我也学了那么点皮毛,但是json数据对于WEB的开发确实很重要,苦苦学习了很长一段时间,不断的关系PGSQL的动向!

    好在翻看很多高人的例子和介绍,终于自己总结了一下pgSQL对于json的查询

    在以往存在于数据库中的大对象或者一串字符串,想要根据其内容来查找数据几乎是不可能的,之前做的项目就是用XML转成大对象之后存在SQL SERVER里,但是对于查询还是要

    到前台之后拆开数据才可以,这样就成了这次的项目完全就是体验了下XML复杂的树杈功能,对于数据集合、整理没有丝毫进步

    后来接触了pgSQL,从刚开始的JSON输出,到现在的直接查找数据以及直接拼接JSON,到这里,我觉得有必要推翻自己以前的一些想法来弄点新东西出来,故再次做个笔记总结

    {更新记录

    ---20150614 数组

    }

    下这段时间来的所学,代码都是网上复制的,懒惰呀。。。。再次感谢分享代码的大大!!

    一张表

    CREATE TABLE job
    (
     jobid SERIAL primary key ,
     jobdesc json
    )

    然后在里面弄点数据

    insert into job(jobdesc) values('{  
      "jobname":"linux_os_vmstat",
      "schedule":{
          "type":{"interval":
              "5m"
          },
          "start":"now",
          "end":"None"
      },
      "values":{
          "event":["cpu_r","cpu_w"],
          "data":["cpu_r"],
          "threshold":[1,1]
      },
      "objects":{
          "wintest1":"cpu"
      } 
    }');


    insert into job(jobdesc) values('{  
      "jobname":"Oracle_tbs_space",
      "schedule":{
          "type":{"interval":
              "1d"
          },
          "start":"now",
          "end":"None"
      },
      "values":{
          "event":["used"],
          "data":["used"],
          "threshold":["90%"]
      },
      "objects":{
          "wintest1":"oradb1"
      } 
    }');

    遇上的json串已经复杂的很多了,实际应用我觉的没有必要这么复杂,至少我用不上

    首先是返回指定数据:

    # select jobdesc->>'jobname' as jobname from job where jobdesc->'objects'->>'wintest1' like 'oradb1';
        jobname
    ------------------
    oracle_tbs_space
    (1 行记录)

    以上可以看出   jobdesc->'objects'->>'wintest1' 这个部分就是指向摸个json数据节点的

    对于符号的解释其实我也不是很懂,高手是这么说的:

    ->(返回对象类型)
    ->>(返回字符型)
    #>>(选择数组类型)

    反正这里可以直接指向某个json数据的节点作为where来返回条件了

    由于还可以对数组元素选择,用的符号是#>>


    # select jobdesc->'values'#>>'{event,0}' as value1 from job where jobdesc->>'jobname' = 'linux_os_vmstat';
    value1
    --------
    cpu_r
    (1 行记录)

     event,0  意思就是 event数组的0位置的值

    经过测试 支持 二维数组  如 event= "event":[["cpu_r"],["cpu_w"]]

    用'{event,0,0}' 可以访问到 0 ,0 位置的值 cpu_r

    ---------------------------

    然后是更新记录


    #update job  set jobdesc = '{  
      "jobname":"linux_os_vmstat",
      "schedule":{
          "type":{"interval":
              "5m"
          },
          "start":"now",
          "end":"None"
      },
      "values":{
          "event":["cpu_r","cpu_w"],
          "data":["cpu_r"],
          "threshold":[1,2]
      },
      "objects":{
          "wintest1":"cpu"
      } 
    }' where jobdesc->>'jobname' = 'linux_os_vmstat';
    UPDATE 1
    # select jobdesc->'values'#>>'{threshold,1}' as threshold2 from job
    where jobdesc->>'jobname' = 'linux_os_vmstat';
    threshold2
    ------------
    2
    (1 行记录)


    更新json类型字段时必须整个字段都更新,无法采用指定内部特定值方法更新。

    删除记录其实也是同理的:

    delete from job where jobdesc->>'jobname' = 'linux_os_vmstat';

    而后自己做了个实验

    在 jobdesc 插入数据

    一:{"a":"9","b":"2","c":"3","d":"4"}  

    二:{"a":"1","b":"2","c":"3","d":"4"}

    select jobdesc->>'a'  from job where jobdesc ->>'a' = '1'

    返回1

    select jobdesc  from job where jobdesc ->>'a' = '1'

    返回 {"a":"1","b":"2","c":"3","d":"4"}

    由于目地已经达到了!

  • 相关阅读:
    buuctf-misc 一叶障目
    攻防世界-web ics-05
    攻防世界-web ics-06
    攻防世界-web NewsCenter
    攻防世界-web upload1
    攻防世界-web unserialize3
    攻防世界-web PHP2
    攻防世界-web2
    gitlab常用命令
    javascript编程风格
  • 原文地址:https://www.cnblogs.com/neights/p/3548362.html
Copyright © 2020-2023  润新知