目录
一、Pre 前言
二、知识点拆解
1)case when…then…else
2)json_value 函数
拓展资料
3)CAST 函数
拓展资料
4) ROUND 函数
5)occurences_regexpr 函数
拓展资料
6)正则表达式
拓展资料
三、整合分析
1)先说正则表达式
2)结合hana 函数
3)结合case when
四、废话
一、Pre 前言
hello,来摸鱼了
先贴条代码:
case when occurences_regexpr('([^[:digit:]-.])' in json_value(t2.item_properties,'$.min_score')) = 0
then round(cast(json_value(t2.item_properties,'$.min_score') as double,1)
else null end as min_score
item_properties 字段是t2表里的一个起说明作用的字段,值长这样:
{"up_score":"3","min_score":"-7"}
因为没看懂这段代码里的正则表达式,连带着看不懂这条代码要表达什么,正愁没事干,闲庭信步地研究了一上午,终于懂了,什么叫小而美啊,什么叫大道至简啊!
感兴趣的请听我逐层分析~
— —
算了,写到后面感觉,啊!层数好多啊,怎么还没说完,我说到哪一层了来着?
So,我就回来了,咱还是两步走,先说结论,不浪费彼此的生命哈。
这段代码所表达的意思是:
如果 t2.item_properties 里只有数字、负号和小数点 就把这个字段里的min_score值转成一位小数,如果有除此之外的其他字符就给min_score取空值。
还是那句话,大道至简。
好了,要看分析的跟我来。
二、知识点拆解
1)case when…then…else
这是一句sql里常见的分支判断语句,用来做字段条件筛选的
“手谈”一波demo如:
-- 创建数据库 test
create database test;
-- 切换使用数据库 test
use test;
-- 创建表
create table test_tbl(
id int primary key
,gender int
);
-- 插入测试数据
insert into test_tbl values(0,1),(1,1),(2,0);
-- 查验数据
select * from test_tbl;
select
id
,case when gender = 0 then '女'
else '男'
end as gender
from test_tbl;
以下为运行结果:
2)json_value函数
JSON_VALUE ( expression , path ):用于获取json字符串的值,获取到的值是string类型
json_value(t2.item_properties,'$.min_score')
item_properties 字段是某表里的一个起说明作用的字段,大概值长这样
{"up_score":"3","min_score":"-7"}
这段代码的效果是,获取item_properties这个存储着json字符串的字段里,key为‘min_score’的value值: “-7” (字符串类型!)
拓展资料
JSON_VALUE 详解
JSON 路径表达式 - SQL Server | Microsoft Learn
3)CAST 函数
类型转换函数,语法是:
语法:CAST (expression AS data_type)
还是刚才那个demo,多加一列salary和一列age
ALTER TABLE test_tbl add age VARCHAR(20);
INSERT INTO test_tbl VALUES(3,0,'12',53.23);
ALTER TABLE test_tbl add salary DOUBLE;
INSERT INTO test_tbl VALUES(4,0,'13',23.678);
使用CAST把数据转换成INT类型:
这里有个注意点是,在MySQL里string转的时候,需要在int前面加上前缀(signed or unsigned),否则会报错;不过我在Hive里试了下,是不需要前缀的(可能直接隐式转换了)
SELECT
id
,gender
,cast(age as SIGNED INT) as age
,salary
FROM test_tbl;
拓展资料
SQL中的cast()函数_cast sql-CSDN博客
4) ROUND函数
ROUND(number, num_digits)
可以修改数值字段的精度,比如
SELECT
round(3.1415) as num
,round(3.1415 ,1) as num1
,round(3.1415 ,2) as num2
,round(3.1415 ,3) as num3
;
5)occurences_regexpr 函数
这个是hana里的函数:用来返回字符串中正则表达式搜索到的匹配次数,返回的是数字,匹配几次就返回几
occurences_regexpr(正则表达式 IN 字符串|存储了字符串的字段)= int
拓展资料
SAP HANA函数汇总(3)——字符串函数_hana 字符串函数-CSDN博客
6)正则表达式
这一块就很大了,今天只说这个案例,其他详见拓展资料
其他全都去掉,只看正则表达式,它长这样:
[^[:digit:]-.]
1、首先,最外层的[ ]中括号
中括号单独出现的时候,它表示匹配括号内列举出的任意字符
2、但是,如果中括号内有一个^ 符号,变成这样 [^ ]
就代表:(取反)没在括号内列举出来的任意字符
3、第三层:[:digit:]
这是一个固定的写法,代表0-9的数字,可以看到也是由中括号[ ]发起的,代表匹配括号内列举出的任意字符,这个任意字符是什么呢,是digit(0-9)
好的。
4、后面两个字符:-.
大道至简,没有特殊的含义,就是本身的意思:负号和小数点
拓展资料
sql-正则表达式 - 知乎 (zhihu.com)
三、整合分析
1)先说正则表达式
[^[:digit:]-.]
结合正则表达式拆解的1-4点,这个正则表达式的意思是
从内层:代表 数字、负号和小数点
读取到外层:除了 数字、负号和小数点 以外的所有字符
所以整体要表示的意思就是:匹配除了 数字、负号和小数点 以外的所有字符
2)结合hana 函数
occurences_regexpr('([^[:digit:]-.])' in json_value(t2.item_properties,'$.min_score')) = 0
取到item_properties列中min_score的所有值,并拿着正则表达式去找,除了 数字、负号和小数点 以外的所有字符 有几个,当没有匹配到,也就是说,min_score的所有值里只有数字、负号和小数点这三种字符
3)结合case when
case when occurences_regexpr('([^[:digit:]-.])' in json_value(t2.item_properties,'$.min_score')) = 0
then round(cast(json_value(t2.item_properties,'$.min_score') as double,1)
else null end as min_score
当:min_score的所有值里只有数字、负号和小数点这三种字符时(也就是数值类型的数据)时
就:把这个min_score转换成保留一位小数的double类型
否则:(也就是:非数值类型的数据)就把这个min_score的值为null
四、废话
研究这个玩意研究了将近一上午,写这个笔记又写了将近一下午。
行。
充实的一天。
然后我还是希望自己能成长为一个说人话的大佬,永远怀抱小白思维~
看得开心。
END