Hana SQL+正则表达式

目录

一、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;

以下为运行结果:

Hana SQL+正则表达式_第1张图片

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);

Hana SQL+正则表达式_第2张图片

使用CAST把数据转换成INT类型:

这里有个注意点是,在MySQL里string转的时候,需要在int前面加上前缀(signed or unsigned),否则会报错;不过我在Hive里试了下,是不需要前缀的(可能直接隐式转换了)

SELECT
 id
,gender
,cast(age as  SIGNED INT) as age
,salary
FROM test_tbl;

Hana SQL+正则表达式_第3张图片

拓展资料

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


 

你可能感兴趣的:(SQL,数据库,hana)