kbmmw 中JSON 中使用SQL 查询

前面讲到了kbmmw 的JSON 对象操作,如何快速的查找JSON 中的值?

一种办法就是通过遍历的方法,其实在kbmmw 还有一种灵活的查询方式,

就是通过SQL 方式查询JSON 中的值。也就是说用TKbmmwmemSQL 控件来实现。

TKbmmwmemSQL 也可以用来查询 XML 和 CSV 文件,今天只说一下JSON 的查询。

我们首先在窗体中放一个Tkbmmwmemsql 控件,

如图设置其属性。

直接使用kbmmwmemSQL控件查询JSON , 首先需要把json串 保存成文本文件。

这里提供一个简单的jSON 文件,内容如下:

 

{"result":[{"ID":1,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":2,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":3,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":4,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":5,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":6,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":7,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":8,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":9,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"},{"ID":10,"name":"xalion","date":"2017-07-05T23:05:48.290+08:00"}]}

 

文件名为aaa.json,存放在当前目录下。

然后我们执行以下代码

procedure TForm1.Button5Click(Sender: TObject);
var
  sqls:string;
begin
 sqls:='SELECT ID,name,date FROM datafile FILE(JSON,''.\aaa.json'')'
      +' SUBSET ''/result/.*'''
     +' ORDER BY ID';
  memo2.Lines.Clear;
  memo2.Lines.Add(sqls);
  kbmmwmemsql1.ExecSQL(sqls);
end;

运行结果如下

加入条件,继续查询。

procedure TForm1.Button5Click(Sender: TObject);
var
  sqls:string;
begin
 sqls:='SELECT ID,name,date FROM datafile FILE(JSON,''.\aaa.json'')'
      +' SUBSET ''/result/.*'''
      +' where ID=5'
      +' ORDER BY ID';
  memo2.Lines.Clear;
  memo2.Lines.Add(sqls);
  kbmmwmemsql1.ExecSQL(sqls);
end;

运行结果如下:

怎么样,方便不?

有的人可能觉得要存成文件,不方便,怎么办?

好吧,我们换个姿势,再来。

我们可以直接使用Tkbmmwmemsql 直接把JSON 对象加进去,然后像正常的表进行查询。

代码如下:

procedure TForm1.Button6Click(Sender: TObject);
var
   js:TkbmMWJSONStreamer;
   fjson:TkbmMWONCustomObject;
   sqls:string;
begin
     js:=TkbmMWJSONStreamer.Create;
     fjson:=js.LoadFromUTF16String(memo1.Text);
     js.Free;
     kbmmwmemsql1.Tables.Add('MYJSONT',FJSON);

     sqls:='SELECT ID,name,date FROM MYJSON'
      +' SUBSET ''/result/.*'''
      +' ORDER BY ID';
  memo2.Lines.Clear;
  memo2.Lines.Add(sqls);
  kbmmwmemsql1.ExecSQL(sqls);
end;

 

运行结果如图

同样可以加入查询条件

 

procedure TForm1.Button6Click(Sender: TObject);
var
   js:TkbmMWJSONStreamer;
   fjson:TkbmMWONCustomObject;
   sqls:string;
begin
     js:=TkbmMWJSONStreamer.Create;
     fjson:=js.LoadFromUTF16String(memo1.Text);
     js.Free;
     kbmmwmemsql1.Tables.Add('MYJSONT',FJSON);

     sqls:='SELECT ID,name,date FROM MYJSON'
      +' SUBSET ''/result/.*'''
      +' where ID=6'
      +' ORDER BY ID';
  memo2.Lines.Clear;
  memo2.Lines.Add(sqls);
  kbmmwmemsql1.ExecSQL(sqls);
end;

运行结果如图

打完收功。

 

注意,要运行以上例子,请引用kbmMWJSON, kbmMWSQLJSONAPI,kbmMWObjectNotation

这几个单元。

 

时间: 2024-09-26 22:08:06

kbmmw 中JSON 中使用SQL 查询的相关文章

我想写一个关于json串的sql查询,具体请看下面,

问题描述 我想写一个关于json串的sql查询,具体请看下面, 我想写一个关于json串的sql查询,比如说我数据库的某一字段是'BZ',内容是{name:123,age: 14},{name:456,age: 15}这样的,请问如何写查询,比如说通过name的值来查找 age的值,我要比如说我要查的name=123的 那么该'BZ'字段显示的就是 14 ,各位大神帮帮忙啦,小弟不胜感激!!! 解决方案 select max(case getname(BZ) when '123' then ge

Spring+Mybatis实现动态SQL查询

在报表类应用中,通常需要根据不同的维度去组合复杂的查询条件,然后构造SQL去执行查询.如果只是通过在程序中简单地拼接SQL语句,工作量会非常大,而且代码可能也非常难以维护.Mybatis支持动态SQL查询功能,可以通过配置动态的SQL来简化程序代码中复杂性,不过,这个颇有点XML编程的韵味,通过XML来处理复杂的数据判断.循环的功能,其实也很好理解. 准备工作 下面,我们首先创建一个MySQL示例表,如下所示: 01 CREATE TABLE `traffic_info` ( 02 `id` i

sql查询:如何用A组数据去查询另外一张表里的一个字段的数据并按A组数据的顺序排序

问题描述 sql查询:如何用A组数据去查询另外一张表里的一个字段的数据并按A组数据的顺序排序 我有这样的一组数据定为A:这个数据和我另一张表user_cards 中 grant_pid的数据是相等了,我想通过这组数据去查partner_id的数据并且按照A数据的这个顺序. 解决方案 select A.idB.id from A inner join B on A.id=B.id order by A.id 解决方案二: sql_查询一张表中的重复数据sql查询一张表的重复数据

sql子查询中列别名在主查询中无效

问题描述 sql子查询中列别名在主查询中无效 CREATE PROCEDURE dbo.query_test( @i_begin_time varchar(128) IN, /* 开始时间 / @i_end_time varchar(128) IN, / 结束时间 / @i_bussiness_tpe varchar(512) IN, / 类型 ) as declare @v_sql varchar(16384)/* 定义 需要执行的sql / declare @Rtime varchar(12

在C#中建立复杂的、灵活的SQL查询/命令

SelectQueryBuilder类允许在你的代码中建立复杂的SQL语句和命令.它也能帮助于避免SQL注入式攻击. 介绍 承认,并且我们都这样作过,也认为下面的方式是最好的和唯一的方式.就是我们建立大量的字符串包含所有的Where子句,然后提交到数据库去执行它.来断的加语句到我们的SQL字符串,极有可能会带来Bugs和SQL注入式攻击的危险.并且也使得我们的代码更难看也不易于管理. 这种情况必须停止,但如何停止?有人说使用存储过程.但它并没有真正的解决这个问题.你还得动态建立你的SQL语句,只

使用SQL查询DB2 9中的XML数据

虽然 DB2 的混合体系结构与之前的版本有很大的不同,但是要利用它的新 XML 功能并不难.如果您已经熟悉 SQL,那么很快就可以将这方面的技能转化到对存储在 DB2 中的本地 XML 数据的处理上.通过本文就可以知道如何实现这一点. DB2 Viper(就是DB2 9)中的 XML 特性包括新的存储管理.新的索引技术以及对查询语言的支持.在本文中,学习如何使用 SQL 或带 XML 扩展的 SQL(SQL/XML)查询 DB2 XML 列中的数据.接下来的文章将讨论 DB2 中新引入的对新兴的

SQL查询语句中的bool类型字段值的写法

  SQL查询语句中的bool类型字段值的写法 没有系统地看过SQL语句的写法说明,只是看了一些常用SQL语句的例子.今天写了条select * from table where sex='true',老是提示标准数据类型不匹配(我用的Access),检查了半天,原来sex字段作为bool(是/否)类型,在SQL语句中其值不需要用''引起来.

sql查询同一表中不同ID的值

问题描述 sql查询同一表中不同ID的值 查询name为'xiaofengceshi'的不同aucid的最大now_price值(结果为两条,aucid为1和3) 解决方案 select max(now_price) from test_tb where name='xiaofengceshi' group by aucid

select-oracle将查询的结果再存入到另一个表中,如何写sql或者说怎么实现

问题描述 oracle将查询的结果再存入到另一个表中,如何写sql或者说怎么实现 具体如select count(*) from test3;(test3表里面有8条数据) 将这个结果再insert到另一张表中.我试着写了 insert into sum select count(*) from test3;这个但是插入的数据不是8而是1,很郁闷 解决方案 insert into 目标表(字段列表) select 字段列表 from 原始表 能达到你的需求 解决方案二: count(*)是取多少