sql 通用查询条件组织及对象转sql语句

  • Sqlconds 简介
  • Install 安装
  • Usage 使用
  • 通用查询条件组织:
  • 分组条件组织(待完善)
  • 聚合统计条件组织(待完善)
  • 数值对象转为insert/update语句
  • Grammer 参数语法
  • condPackage 通用查询过滤条件组织/排序条件
  • groupCondPackage 分组查询条件组织
  • statisCondPackage 聚合统计条件组织
  • objtosql 数组对象转为insert/update语句
  • example 示例


Sqlconds 简介

前后台约定通用查询条件

功能点:
    ◇sql 通用查询条件组织
    ◇sql 通用统计条件组织
    ◇将数组对象转换为insert/update语句。

Install 安装

npm install sqlconds

Usage 使用

通用查询条件组织:

// github仓库地址: https://github.com/aixinyongheng/sqlconds
 // cjs 引入方式
 const Sqlconds = require('sqlconds');
 // es6 引入方式
 import Sqlconds from "sqlconds";
 
 const sqlconds =new Sqlconds("postgres"); // postgres/mysql/oracle ...
 // 1.筛选条件组织
 const sqlres= sqlconds.condPackage( [{"operator":"EQ","field":"bm","value":"zrzhczt_ggfwss_xx"},{"operator":"OBD","field":"px"}] );

 console.log(sqlres.cond); // and   (  "bm"   =   'zrzhczt_ggfwss_xx' )
 console.log(sqlres.order); // order by   "px" desc

 console.log(`select * from tableA where 1=1 ${sqlres.cond} ${sqlres.order}`);

分组条件组织(待完善)

// 2. 分组条件组织
 // 2.1 分组group by 字段
 const groupbyRes=sqlconds.groupCondPackage('[{ "type":"CG", "field":"field1", "rename":"newfield1" },{ "type":"SUB", "field":"field2,1,4", "rename":"newfield2" }]');

  console.log(groupbyRes.groupbycond); //  group by "field1",substring(field2,1,4) 
  console.log(groupbyRes.fields); //  "field1" AS "newfield1",substring(field2,1,4) AS "newfield2" 

  console.log(`select count(*),${groupbyRes.fields} from tableA where 1=1 ${sqlres.cond} ${groupbyRes.groupbycond}`);

聚合统计条件组织(待完善)

// 2.2 聚合统计函数组织
  const statiscondRes = sqlconds.statisCondPackage([{"field":"field1","type":"ZDZ","rename":"最大值","dpoint":0}]);
  console.log(statiscondRes.statiscond); //  max("field1") AS "最大值" 

  console.log(`select count(*),${groupbyRes.fields},${statiscondRes.statiscond} from tableA where 1=1 ${sqlres.cond} ${groupbyRes.groupbycond}`);

数值对象转为insert/update语句

const Sqlconds = require('sqlconds');
 const sqlconds = new Sqlconds("postgres");
    const res = sqlconds.objtosql("tableA", [{
      "id": "111", "name": "test", "geom": {
        "coordinates": [112.3257164817677,
          35.342031483036436
        ],
        "type": "Point"
      }
    }], { geomfields: 'geom' });
    console.log(res.sql);// insert into "tableA" ("id","name","geom") values ('111','test',public.ST_SetSRID(public.st_geomfromgeojson('{"coordinates":[112.3257164817677,35.342031483036436],"type":"Point"}'),4490)) RETURNING *;

Grammer 参数语法

condPackage 通用查询过滤条件组织/排序条件

params

require

paramname

description

conds

yes

组织sql筛选条件

conds.field

yes

字段名

conds.operator

yes

操作类型

EQ: ’ = ', EQN: ‘!=’, EQ_D: ’ = ', GT: ’ > ', LT: ‘<’, GTE: ’ >= ', LTE: ’ <= ', FQ: ’ like ’ (field like ‘%value’), FQR: ’ like '(field like ‘$value%’), INULL: ’ is null ', INNULL: ’ is not null ', IN: ’ in ', INN: 'not in ',JSONIN: ’ ? ', GEOMINTER: ‘=’, GEOMNOTINTER: ‘=’ OBA: ’ order by ', OBD: ’ order by ', OB: ’ order by ’

conds.value

no

条件值

conds.whereLinker

no

条件连接符

默认 and

conds.condition

no

条件

传参内容为conds

conds.whereLinkerCondition

no

内部条件连接符

当condition存在时,连接其条件的连接符,默认and

rntable

no

表名

groupCondPackage 分组查询条件组织

params

require

paramname

description

conds

yes

组织group by 字段条件

1.支持支持字段名,分隔 2.支持数组对象,具体参数如下

conds.type

yes

操作类型

CG:常规 field正常为字段名 SUB: substring 函数,field中为substring的函数内部的内容

conds.field

yes

字段名

当type为CG时,传入字段名;当type为SUB时,为substring函数内部内容

conds.rename

yes

重命名字段名

返回分组查询字段时重命名

statisCondPackage 聚合统计条件组织

params

require

paramname

description

conds

yes

组织聚合统计条件

conds.type

yes

聚合统计类型

ZDZ: ‘最大值’, ZXZ: ‘最小值’, PJZ: ‘平均值’, BZC: ‘标准差’, FC:‘方差’,QH:‘求和(sum)’,STR:(string_agg ,分隔 ),ARR:(array_agg),JIA,JIAN,CHENG,CHU

conds.field

yes

字段名

conds.rename

yes

重命名字段名

返回分组查询字段时重命名

conds.dppoint

no

保留精度(小数点后几位)

返回统计字段时保留精度

objtosql 数组对象转为insert/update语句

num

params

require

paramname

description

1

tablename

yes

表名

插入/更新表名

2

DataList

yes

数组对象

eg: [{“field1”:“value1”,“field2”:“value2”}]

3

config

no

配置

3

config.idfield

no

主键,更新时条件字段

3

config.pattern

no

插入模式

模式 【insert/auto】 insert 时,只生成insert语句, auto时,会根据数据对象中是否存在idfield去生成 insert/update 语句

3

config.timefields

no

时间字段配置

,分隔字段名,配置为时间字段的数值为-1时,会使用数据库时间now()赋值

3

config.geomfields

no

空间类型字段设置(postgres时支持)

,分隔字段名

3

config.geomsrid

no

空间字段坐标系类型 (postgres时支持) 默认4490

example 示例

1.支持高级查询条件
2.支持pg的空间相交函数

复杂查询示例:

require

conds

result

查询表中field1为11,并且field2同时为1和2的条件

[{“operator”:“EQ”,“field”:“field1”,“value”:“11”,“condition”:[{“operator”:“EQ”,“field”:“field2”,“value”:“1”},{“whereLinker”:“or”,“operator”:“EQ”,“field”:“field2”,“value”:“2”}]}]

and “field1” =‘11’ and ( “field2”=‘1’ or field2=‘2’ )

pg中查询与114,32点位相交的数据

[{“operator”:“GEOMINTER”,“field”:“geom”,“value”:{“type”:“Point”,“coordinates”:[118.530982355499,28.6730332199371]}}]

and ( st_intersects( “geom” , st_setsrid(st_geomfromgeojson(‘{“type”:“Point”,“coordinates”:[118.530982355499,28.6730332199371]}’),4490)) = true )

待完善:
sql拼接防止sql注入(todo)
支持更多数据库类型(todo)
支持拓展自定义查询插值条件(todo)