WHERE 条件 column 为纯英文字符 或 不包含任何字符
语法:
sql
SELECT * FROM your_table WHERE REGEXP(your_column,'^[A-Za-z]+$');
SELECT * FROM your_table WHERE NOT REGEXP(your_column,'^[A-Za-z]+$');
例:
sql
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE REGEXP_LIKE(t.pldlibho, '[a-zA-Z]+$');
-- 不包含任何英文字符
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE NOT REGEXP_LIKE(t.pldlibho, '[a-zA-Z]+$');
WHERE 条件 column 为纯数字 或 不包含任何数字
语法:
sql
SELECT * FROM your_table WHERE REGEXP(your_column,'^[0-9]+$');
SELECT * FROM your_table WHERE NOT REGEXP(your_column,'^[0-9]+$');
例:
sql
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE REGEXP_LIKE(t.pldlibho, '^[0-9]+$');
--不包含任何数字
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE NOT REGEXP_LIKE(t.pldlibho, '^[0-9]+$');
PARTITION BY 的简单使用
更详细的讲解请点击链接查看。
说明:
partition by窗口函数 和 group by分组的区别:
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录。
partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。
partition by与group by不同之处在于前者返回的是分组里的每一条数据,并且可以对分组数据进行排序操作。后者只能返回聚合之后的组的数据统计值的记录。
partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序(类似excel中的操作),而group by则只保留参与分组的字段和聚合函数的结果; 简单来说窗口函数对部分数据进行排序、计算等操作,group by对一组值进行聚合,即窗口函数是每一行都会保留,group by是从多行浓缩为少数行。
语法:
sql
<窗口函数> over ( partition by<用于分组的列名> order by <用于排序的列名>)
窗口函数:
专用窗口函数: rank(), dense_rank(), row_number()
聚合函数 : sum(), max(), min(), count(), avg() 等
例:
sql
SELECT m.qyuezhao,
CASE m.dxnqyzht
WHEN '3' THEN
'欠费'
WHEN '4' THEN
'暂停'
END
FROM (SELECT Row_number() over(PARTITION BY t.dxnqyzht ORDER BY t.qyuezhao) rn,
t.qyuezhao,
t.dxnqyzht
FROM kibb_dxinqy t
WHERE t.dxnqyzht IN ('3', '4')) m
WHERE rn <= 10;
sql
SELECT *,rank() over(partition by type order by price desc) as mm from commodity;
SELECT *,row_number() over(partition by type order by price desc) as mm from commodity;
SELECT *,dense_rank() over(partition by type order by price desc) as mm from commodity;
从以上结果来看:
rank()函数:如果存在并列名次的行,会占用下一个名次的位置,比如苹果的组内排名 1,2,3,4, 但是由于有两个是并列的,所以显示的排名是 1,1,3,4 ,其中 2 的位置还是被占用了
row_number()函数:不考虑并列的情况,此函数即使遇到了price 相同的情况,还是会默认排出一个先后来
dense_rank()函数:如果存在并列名次的行,不会占用下一个名次的位置,例如图片的最后显示的是 1,1,2,3
json格式字符串处理相关函数
IS JSON
判断某个字段是否为有效json
sql
select * from kapb_jioybw bw where bw.quanjuls = 'GFTS002021051100001685916' and bw.jiaoyirq = '20210511';
JSON_VALUE
JSON_VALUE只支持scalar value,即只返回一行一列,通常用在select语句或where条件中。
JSON_VALUE接受两个参数,即JSON文档(document)和到指定属性的路径(path),返回值可以格式化。
JSON_VALUE支持错误处理,例如当指定的path不正确(如路径不存在,大小写不匹配),返回多个值(非scalar)时。错误处理方式有3种,默认为返回空值(NULL ON ERROR),其它为返回指定默认值(DEFAULT on ERROR),报错(ERROR ON ERROR)。
NULL演示
sql
-- 错误示例1:Address返回多个属性,不是scalar. Address改为Address.city就正确了。
select JSON_VALUE(xnybwvar ,'$.ShippingInstructions.Address')
from kapb_jioybw p
where JSON_VALUE(xnybwvar ,'$.PONumber' returning NUMBER(10)) = 1
and p.quanjuls = 'GFTS002021051100001685917' and p.jiaoyirq = '20210511';
sql
-- 错误示例2:大小写错误,Name应为name
select JSON_VALUE(xnybwvar ,'$.ShippingInstructions.Name')
from kapb_jioybw p
where JSON_VALUE(xnybwvar ,'$.PONumber' returning NUMBER(10)) = 450
and p.quanjuls = 'GFTS002021051100001685917' and p.jiaoyirq = '20210511';
sql
-- DEFAULT on ERROR演示
sql
-- ERROR ON ERROR演示
sql
-- 以上所的错误处理只针对运行时错误,例如以下Address前的.写成了,号,则不在以上所说错误处理的范畴:
JSON_QUERY
JSON_QUERY是JSON_VALUE的补充,参数个数与类型与其一样,但可返回一个对象或array。
输出中省去了很多空格,但为了美观,你也可以加PRETTY关键字以添加缩进和对齐:
下例为使用array index以返回array中的一个对象:
注意JSON_QUERY只能返回对象,如果path指定是一个scalar值,则默认返回空值,例如:
JSON_QUERY的错误处理有三种,默认为NULL ON ERROR, ERROR ON ERROR与JSON_VALUE类似,EMPTY ON ERROR返回空的array。
最常见的错误是返回值不是object或array,而是scalar值。
不过还有一种特殊方式,可将scalar转换为array:
利用WITH ARRAY WRAPPER将结果强制转换为array
JSON_TABLE
第一个查询显示了如何从文档中最多发生一次的值投射一组列。值可能来自任何级别的嵌套,只要它们不来自组的键,或来自阵列的后裔,除非使用索引来识别数组中的一个项目。
sql
select M.*
from kapb_jioybw p,
JSON_TABLE(p.xnybwvar,
'$' columns PO_NUMBER NUMBER(10) path '$.PONumber',
REFERENCE VARCHAR2(30 CHAR) path '$.Reference',
REQUESTOR VARCHAR2(32 CHAR) path '$.Requestor',
USERID VARCHAR2(10 CHAR) path '$.User',
COSTCENTER VARCHAR2(16 CHAR) path '$.CostCenter',
TELEPHONE VARCHAR2(16 CHAR) path
'$.ShippingInstructions.Phone[0].number') M
where p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511'
and PO_NUMBER between 1 and 2;
如果输出的列仍是对象或array,则可使用嵌套(NESTED PATH):
sql
select M.*
from kapb_jioybw p,
JSON_TABLE(p.xnybwvar,
'$' columns(PO_NUMBER NUMBER(10) path '$.PONumber',
REFERENCE VARCHAR2(30 CHAR) path '$.Reference',
REQUESTOR VARCHAR2(32 CHAR) path '$.Requestor',
USERID VARCHAR2(10 CHAR) path '$.User',
COSTCENTER VARCHAR2(16) path '$.CostCenter',
NESTED PATH '$.LineItems[*]'
columns(ITEMNO NUMBER(16) path '$.ItemNumber',
DESCRIPTION VARCHAR2(32 CHAR) path
'$.Part.Description',
UPCCODE VARCHAR2(14 CHAR) path
'$.Part.UPCCode',
QUANTITY NUMBER(5, 4) path '$.Quantity',
UNITPRICE NUMBER(5, 2) path
'$.Part.UnitPrice'))) M
where p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511'
and PO_NUMBER between 1 and 2;
JSON_TABLE常用于建立关系型视图,然后可以用标准的SQL语句操作。
sql
create or replace view json_test_view
as
select M.*
from kapb_jioybw p,
JSON_TABLE(p.xnybwvar,
'$' columns(PO_NUMBER NUMBER(10) path '$.PONumber',
REFERENCE VARCHAR2(30 CHAR) path '$.Reference',
REQUESTOR VARCHAR2(32 CHAR) path '$.Requestor',
USERID VARCHAR2(10 CHAR) path '$.User',
COSTCENTER VARCHAR2(16) path '$.CostCenter',
NESTED PATH '$.LineItems[*]'
columns(ITEMNO NUMBER(16) path '$.ItemNumber',
DESCRIPTION VARCHAR2(32 CHAR) path
'$.Part.Description',
UPCCODE VARCHAR2(14 CHAR) path
'$.Part.UPCCode',
QUANTITY NUMBER(5, 4) path '$.Quantity',
UNITPRICE NUMBER(5, 2) path
'$.Part.UnitPrice'))) M
where p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511'
and PO_NUMBER between 1 and 2;
定义完这些视图后,开发者就可以完全利用SQL的能力了。
JSON_EXISTS
用在where语句中,和EXISITS类似,测试JSON document中是否存在指定的path。
sql
select count(*)
from kapb_jioybw p
where JSON_EXISTS(p.xnybwvar, '$.ShippingInstructions.Address.state')
and p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511'
JSON_EXISTS可以区分key不存在或key存在,value不存在或为空的情形,试比较以下输出:
sql
select JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county'),
count(*)
from kapb_jioybw p
where p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511'
group by JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county');
sql
select JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county'),
count(*)
from kapb_jioybw p
where p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511'
and JSON_EXISTS(p.xnybwvar, '$.ShippingInstructions.Address.county')
group by JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county');
JSON_EXISTS还支持predicate,就是可以带条件。
sql
select p.xnybwvar
from kapb_jioybw p
where JSON_EXISTS(p.xnybwvar,
'$?(@.PONumber == $PO_NUMBER)' passing 1 as "PO_NUMBER")
and p.quanjuls = 'GFTS002021051100001685917'
and p.jiaoyirq = '20210511';
sql
SELECT COUNT(1)
FROM kapb_jioybw p
WHERE JSON_EXISTS(p.xnybwvar,
'$?(@.PONumber == $PO_NUMBER)' passing 1 AS "PO_NUMBER")
AND p.quanjuls = 'GFTS002021051100001685917'
AND p.jiaoyirq = '20210511';
JSON索引
使用JSON_VALUE创建的唯一索引,基于的值必须是scalar,而且必须唯一。可以是B-Tree索引或Bitmap索引。
sql
create unique index PO_NUMBER_IDX
on kapb_jioybw p (
JSON_VALUE(
p.xnybwvar,'$.PONumber' returning NUMBER(10) ERROR ON ERROR NULL ON EMPTY
)
)