ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL常用函数(多平台对比)

2020-09-20 12:04:08  阅读:457  来源: 互联网

标签:10 01 函数 结果 -- str SQL 字符串 对比


SQL常用函数(多平台对比)

一、数值型函数

(一)Teradata

abs(-10)  --绝对值;结果:10

ceiling(11.999)  --向上取整;返回不小于11.999的最小整数,结果:12
floor(11.999)  --向下取整;返回不大于11.999的最大整数,结果:11

exp(2)  --e的指数;结果:e的2次幂
log(100)  --底数为10,100的对数;结果:2
ln(4)  --4自然对数

sqrt(16)  --平方根;结果:4
power(3,2)  --求幂;结果:9

102 mod 10  --取余;结果:2

round(1.235,2)  --四舍五入;结果:保留2位小数,1.24
trunc(1.235,2)  --截断数字;结果:1.23
random(1,100)  --返回一个随机数;结果:1-100之间的一个随机整数
sign(-10)  --返回数值符号,结果为 -1、1或0;结果:-1

zeroifnull(null)  --将null转换成0

--三角函数
sin(x)  --正弦
asin(x)  --反正弦
cos(x)  --余弦
acos(x)  --反余弦
tan(x)  --正切
atan(x)  --反正切

--双曲函数
sinh(x)  --双曲正弦
asinh(x)  --反双曲正弦
cosh(x)  --双曲余弦
acosh(x)  --反双曲余弦
tanh(x)  --双曲正切
atanh(x)  --反双曲正切

(二)Oracle

abs(-10)  --绝对值;结果:10

ceil(11.999)  --向上取整;返回不小于11.999的最小整数,结果:12
floor(11.999)  --向下取整;返回不大于11.999的最大整数,结果:11

exp(2)  --e的指数;结果:e的2次幂
log(100,10)  --底数为10,100对数;结果:2
ln(4)  --自然对数

sqrt(16)  --平方根;结果:4
power(3,2)  --求幂;结果:9

mod(102,10)  --取余;结果:2

round(1.235,2)  --四舍五入;结果:保留2位小数,1.24
trunc(1.235,2)  --截断数字;结果:1.23
sign(-10)  --返回数值符号,结果为 -1、1或0;结果:-1

--三角函数
sin(x)  --正弦
asin(x)  --反正弦
cos(x)  --余弦
acos(x)  --反余弦
tan(x)  --正切
atan(x)  --反正切

(三)Mysql

--待填坑

(四)Hive

abs(-10)  --绝对值;结果:10

ceil(11.999)  --向上取整;返回不小于11.999的最小整数,结果:12
ceiling(11.999)  --向上取整;返回不小于11.999的最小整数,结果:12
floor(11.999)  --向下取整;返回不大于11.999的最大整数,结果:11

exp(2)  --e的指数;结果:e的2次幂
log10(100)  --底数为10,100的对数;结果:2
log2(4)  --底数为2,4的对数;结果:2
log(2,4)  --底数为2,4的对数;结果:2
ln(4)  --4的自然对数

sqrt(16)  --平方根;结果:4
pow(3,2)  --求幂;结果:9

pmod(102,10)  --取余;结果:2

round(1.235,2)  --四舍五入;结果:保留2位小数,1.24
rand()  --返回一个0-1之间的随机数;结果:0-1之间的一个随机数

sign(-10)  --返回数值符号,结果为 -1、1或0;结果:-1
positive(10)  --取原数;结果:10
positive(-10)  --取原数;结果:-10
negative(10)  --取反;结果:-10
negative(-10)  --取反;结果:10

--三角函数
sin(x)  --正弦
asin(x)  --反正弦
cos(x)  --余弦
acos(x)  --反余弦
tan(x)  --正切
atan(x)  --反正切

二、文本函数

(一)Teradata

'str_1'||'str_2'  --拼接;结果:'str_1str_2'
lpad('a',10,'#')  --把“#”不断添加到字符串左侧,直到字符串满足10位长度。结果:#########a
rpad('a',10,'#')  --结果:a#########

ascii('y')  --将字符串转换为ascii码;结果:121
chr(121)  --将ascii码转换为字符串;结果:y

initcap('hello world')  --将首字母变为大写;结果:'Hello World'
lower('Abc')  --将字符串全部转换成小写字母;结果:abc
upper('abc')  --将字符串全部转换成大写字母;结果:ABC

instr('str', 'r')  --搜索在字符串'str'中是否出现'r',返回0或1;结果:1
length('abc')  --返回字符串长度;结果:3

index('str_r','r')  --定位函数;结果:在'str_r'中搜寻r的位置,返回3
position('r' in 'str')  --定位函数;结果:'r'在'str'中的位置,返回3

substr('str',1,2)  --截取函数;结果:从第1个字符开始,截取2个字符,即:'tr'
substring('str' from 1 for 2)  --同上

strtok(待分割字符串, 分隔符, 返回第几个)
strtok('http://www.teradata.com/', '/.', 3)  --结果:'teradata'
strtok_split_to_table  --类似strtok,返回一个table

reverse('abc')  --反转函数;结果:'cba'

oreplace('a####b###c', '#', '*')  --将字符串中所有的#替换成*
otranslate('s***tr st***r str***', 'str', 'new')  --能够跨字节替换;结果:'n***ew ne***w new***'
otranslate('s***tr st***r str***', 'str', 'ne')  --能够跨字节替换;结果:'n***e ne*** ne***'

trim(both '*' from '**str**')  --去除字符串两侧的空格;结果:'str'
trim('  str  ')  --去除字符串两侧的空格;结果:'str
ltrim('  str  ')  --去除字符串左侧空格;结果:'str  '
ltrim('  aaastr', 'a')  --去除字符串左侧的空格;结果:'aaastr',因为a没有左顶格,所以去不掉
ltrim('aaastr', 'a')  --去除字符串左侧的a;结果:'str'
rtrim('  str  ')  --去除字符串右侧空格;结果:'  str'
rtrim('   str***  ', '*')  --去除字符串右侧的'*';结果:'   str***',*没有右顶格,去不掉
rtrim('   str***', '*')  --去除字符串右侧的'*';结果:'   str'

ngram(字符串1, 字符串2, 匹配粒度)
ngram('abc', '*ab*bc*', 1)  --对比'abc'与'*ab*bc*'在长度粒度为1的情况下,有几个能匹配上;'a'、'b'、'c' 结果:3
ngram('abc', '*ab*bc*', 2)  --对比'abc'与'*ab*bc*'在长度粒度为2的情况下,有几个能匹配上;'ab'、'bc' 结果:2
ngram('abc', '*ab*bc*', 3)  --对比'abc'与'*ab*bc*'在长度粒度为3的情况下,有几个能匹配上;'abc' 结果:0

nvp(目标字符串, 标签字符串, 标签分隔符, 值分隔符, 当有同一个标签名出现时匹配第几个标签的值)
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name1', '** & =', ': = # %', 1)  --结果:n1
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name1', '** & =', ': = # %', 2)  --结果:null
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name2', '** & =', ': = # %', 1)  --结果:n2_1
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name2', '** & =', ': = # %', 2)  --结果:n2_2

(二)Oracle

'str_1'||'str_2'  --拼接;结果:'str_1str_2'
concat('str1','str2')  --拼接;结果:'str1str2'
lpad('a',10,'#')  --把“#”不断添加到字符串左侧,直到字符串满足10位长度。结果:#########a
rpad('a',10,'#')  --结果:a#########

ascii('y')  --将字符串转换为ascii码;结果:121
chr(121)  --将ascii码转换为字符串;结果:y

initcap('hello world')  --将首字母变为大写;结果:'Hello World'
lower('Abc')  --将字符串全部转换成小写字母;结果:abc
upper('abc')  --将字符串全部转换成大写字母;结果:ABC

instr('重庆某某软件公司', '某', 1, 2)  --(全角算1个字符)在字符串'重庆某某软件公司'中从第1个字节开始搜索'某',返回第2次出现的位置;结果:4
instrb('重庆某某软件公司', 1, 2)  --(全角算2个字符)在字符串'重庆某某软件公司'中从第1个字节开始搜索'某',返回第2次出现的位置;结果:7
length('重庆')  --返回字符串长度;结果:2
lengthb('重庆')  --返回字符串长度;结果:4

substr('重庆某某软件公司',3,2)  --(全角算1个字符)截取函数;结果:从第3个字符开始,截取2个字符,即:'某某'
substrb('重庆某某软件公司',3,2)  --(全角算2个字符)截取函数;结果:从第3个字符开始,截取2个字符,即:'庆某'

replace('a####b###c', '#', '*')  --将字符串中所有的#替换成*
translate('s***tr st***r str***', 'str', 'new')  --能够跨字节替换;结果:'n***ew ne***w new***'
translate('s***tr st***r str***', 'str', 'ne')  --能够跨字节替换;结果:'n***e ne*** ne***'

trim(both '*' from '**str**')  --去除字符串两侧的空格;结果:'str'
trim('  str  ')  --去除字符串两侧的空格;结果:'str
ltrim('  str  ')  --去除字符串左侧空格;结果:'str  '
ltrim('  aaastr', 'a')  --去除字符串左侧的空格;结果:'aaastr',因为a没有左顶格,所以去不掉
ltrim('aaastr', 'a')  --去除字符串左侧的a;结果:'str'
rtrim('  str  ')  --去除字符串右侧空格;结果:'  str'
rtrim('   str***  ', '*')  --去除字符串右侧的'*';结果:'   str***',*没有右顶格,去不掉
rtrim('   str***', '*')  --去除字符串右侧的'*';结果:'   str'

(三)Mysql

--待填坑

(四)Hive

'str_1'||'str_2'  --拼接;结果:'str_1str_2'
concat('str1','str2')  --拼接;结果:'str1str2'
lpad('a',10,'#')  --把“#”不断添加到字符串左侧,直到字符串满足10位长度。结果:#########a
rpad('a',10,'#')  --结果:a#########

initcap('hello world')  --将首字母变为大写;结果:'Hello World'
lower('Abc')  --将字符串全部转换成小写字母;结果:abc
upper('abc')  --将字符串全部转换成大写字母;结果:ABC

instr('str', 'r')  --搜索在字符串'str'中是否出现'r',返回0或1;结果:1
length('abc')  --返回字符串长度;结果:3

locate('str_r','r')  --定位函数;结果:在'str_r'中搜寻r的位置,返回3

substr('str',1,2)  --截取函数;结果:从第1个字符开始,截取2个字符,即:'tr'
substring('str',1,2)  --同上

replace('a####b###c', '#', '*')  --将字符串中所有的#替换成*
repeat('str',2)  --将'str'重复2遍;结果:'strstr'

trim(both '*' from '**str**')  --去除字符串两侧的空格;结果:'str'
trim('  str  ')  --去除字符串两侧的空格;结果:'str
ltrim('  str  ')  --去除字符串左侧空格;结果:'str  '
ltrim('  aaastr', 'a')  --去除字符串左侧的空格;结果:'aaastr',因为a没有左顶格,所以去不掉
ltrim('aaastr', 'a')  --去除字符串左侧的a;结果:'str'
rtrim('  str  ')  --去除字符串右侧空格;结果:'  str'
rtrim('   str***  ', '*')  --去除字符串右侧的'*';结果:'   str***',*没有右顶格,去不掉
rtrim('   str***', '*')  --去除字符串右侧的'*';结果:'   str'

regexp_extract('foothebar', 'foo(.*?)(bar)', 2)  --正则匹配;结果:'bar'
regexp_replace('foobar', 'oo|ar', '')  --正则替换;结果:'fb'

三、聚合函数

(一)Teradata

avg()  --平均数
count()  --计数
sum()  --求和
max()  --最大值
min()  --最小值

(二)Oracle

avg()  --平均数
count()  --计数
sum()  --求和
max()  --最大值
min()  --最小值

(三)Mysql

avg()  --平均数
count()  --计数
sum()  --求和
max()  --最大值
min()  --最小值

(四)Hive

avg()  --平均数
count()  --计数
sum()  --求和
max()  --最大值
min()  --最小值

四、转换函数

(一)Teradata

coalesce(arg1,arg2)  --如果arg1为null,则返回arg2,否则返回arg1

cast(arg1 as integer)  --将arg1转化成integer格式
cast(arg1 as date format'yyyy-mm-dd')  --将arg1转化成日期'yyyy-mm-dd'格式

date'2020-01-01'  --结果:2020-01-01
time'18:01:15'  --结果:18:01:15
timestamp'2020-01-01 16:01:01'  --结果:2020-01-01 16:01:01.0
to_date('20200101', 'yyyymmdd')  --结果:2020-01-01
to_timestamp('January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH: MI A.M.')  --结果:1989-01-15 11:00:00.000000
to_number('123')  --结果:123
to_char(123)  --结果:'123'

(二)Oracle

--待填坑

(三)Mysql

--待填坑

(四)Hive

--待填坑

五、时间函数

(一)Teradata

current_date  --当前日期,2020-09-19
current_time  --当前时间,09:44:05+00:00
current_timestamp  --当前时间戳,2020-09-19 09:44:33.160000+00:00

last_day(date'2020-01-01')  --定位2020-01-01所在月份的最后一天;结果:2020-01-31
next_day(date'2020-01-01','monday')  --定位2020-01-01后的第一个星期一
months_between(date'2020-02-28', date'2020-01-01')  --返回2020-01-01和2020-02-28之间的月份数,可能为小数;结果:1.8709...
add_months(date'2020-01-31', 1)  --在2020-01-31的基础上加上1个月
oadd_months(date'2020-01-31', 1)  --在2020-01-31的基础上加上1个月

trunc(date'2020-02-13', 'd')  --截断日期,返回目标日期的指定截断点上,'D'表示截断到目标日期所在周的第一天,'MM'表示所在月初第一天,'Y'表示所在年初第一天;结果:2020-02-09
trunc(date'2020-02-13', 'mm')  --结果:2020-02-01

round(date'2020-02-13', 'mm')  --四舍五入时间,如果时间靠近月末,就取下月初日期,如果靠近月初,就取月初时间;结果:2020-02-01
round(date'2020-02-18', 'mm')  --结果:2020-03-01

extract(day from date'2020-01-03')  --时间抽取函数,从目标时间中抽取日,结果:3
extract(month from date'2020-01-03')  --时间抽取函数,从目标时间中抽取月,结果:1
extract(year from date'2020-01-03')  --时间抽取函数,从目标时间中抽取年,结果:2020

(二)Oracle

--待填坑

(三)Mysql

--待填坑

(四)Hive

--待填坑

六、窗口函数

(一)Teradata

--累加函数
csum(累加列, 排序列 <asc or desc>) <group by 聚合列>

--累积分布函数
cume_dist() over(<partition by 分区列> order by 累积列 <asc or desc> <nulls first or nulls last> <reset when condition>)

--移动平均
mavg(求平均列, 窗口步长, 排序列 <asc or desc>) <group by 聚合列>

--移动求和
msum(求和列, 窗口步长, 排序列 <asc or desc>) <group by 聚合列>

--移动差分
mdiff(差分列, 窗口步长, 排序列 <asc or desc>) <group by 聚合列>

--排序函数
rank(排序列 <asc or desc>)  --相同数值,排序相同,排序断开 
rank() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>)  --相同数值,排序相同,排序断开
dense_rank() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>)  --相同数值,排序相同,排序连续
row_number() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>)  --相同数值,排序不同,排序连续
percent_rank() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>)  --排序比例,即(rank排序数值-1)/(记录数-1)

sel * from 目标表 qualify row_number() <其他窗口函数也可> over(...) = 1;  --从表中查询排序为1的记录

--分位插值函数
percentile_cont(分位值[0-1]) within group (order by 目标排序列 <asc or desc> <nulls first or nulls last>)  --返回位于该分位点应该有的值
percentile_disc(分位值[0-1]) within group (order by 目标排序列 <asc or desc> <nulls first or nulls last>)  --返回位于该分位点应该有的值
median(目标列)  --类似percentile_cont(0.5)

--分类函数
qauntile(4, 目标列 <asc or desc>)  --将目标列分为4类,然后按照类大小排序,返回排序值

--线性回归函数
mlinreg(预测列, 回归窗口, 排序列[自变量])  --返回预测值

(二)Oracle

--待填坑

(三)Mysql

--待填坑

(四)Hive

--待填坑

七、统计相关函数(聚合)

(一)Teradata

--方差(分母不减1)
var_pop(col)
--方差(分母减1)
var_samp(col)

--标准差(分母不减1)
stddev_pop(col)
--标准差(分母减1)
stddev_samp(col)

--协方差(分母不减1)
covar_pop(col_1, col_2)
--协方差(分母减1)
covar_samp(col_1, col_2)

--相关系数
corr(col1, col2)

--峰度
kurtosis(col)
--偏度
skew(col)

--一元线性回归自变量平均值函数
regr_avgx(因变量列, 自变量列)
--一元线性回归因变量平均值函数
regr_avgy(因变量列, 自变量列)
--一元线性回归斜率函数
regr_slope(因变量列, 自变量列)  --返回参数值
--一元线性回归截距函数
regr_intercept(因变量列, 自变量列)  --返回截距值
--R^2
regr_r2(因变量列, 自变量列)
--sum(x**2) - sum(x)*(sum(x)/n)
regr_sxx(因变量列, 自变量列)
--sum(x*y) - sum(x)*(sum(y)/n)
regr_sxy(因变量列, 自变量列)
--sum(y**2) - sum(y)*(sum(y)/n)
regr_syy(因变量列, 自变量列)

(二)Oracle

--待填坑

(三)Mysql

--待填坑

(四)Hive

--同Teradata

八、比较函数(非聚合)

(一)Teradata

greatest(1,3,4,6,7)  --最大值;结果:7
least(1,3,4,6,7)  --最小值;结果:1

(二)Oracle

--待填坑

(三)Mysql

--待填坑

(四)Hive

greatest(1,3,4,6,7)  --最大值;结果:7
least(1,3,4,6,7)  --最小值;结果:1

标签:10,01,函数,结果,--,str,SQL,字符串,对比
来源: https://www.cnblogs.com/rengongzhizhang-v1/p/13699322.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有