ClickHouse常用函数

2023-04-05 18:30
607
0

1. empty相关函数

empty 判断字符串或数组是否为空。空字符返回1,非空字符串返回0。结果类型为UInt8。 示例:select [] as arr, empty(arr)
返回:1
notEmpty 判断字符串或数组是否为非空。空字符返回0,非空字符串返回1。结果类型为UInt8。 示例:select [] as arr, notEmpty(arr);
返回:0

 

 

2. 长度相关函数

length 返回字符串的长度(以字节为单位)和数组的长度。结果类型为UInt64。 示例:select ['我爱'] as arr, length(arr), length('我爱');
返回:数组和字符串的长度分别返回1和2。
lengthUTF8 返回UTF8编码的字符串的长度(以字节为单位)的长度,不能作用于数组。结果类型为UInt64。 示例:select lengthUTF8('我爱');
返回:2
char_length,
CHAR_LENGTH
返回UTF8编码的字符串的长度(以字节为单位)的长度,不能作用于数组。结果类型为UInt64。 示例:select char_length('我爱');
返回:2
character_length
CHARACTER_LENGTH
返回UTF8编码的字符串的长度(以字节为单位)的长度,不能作用于数组。结果类型为UInt64。 示例:select character_length('我爱');
返回:2

 

 

3. 大小写

 

lower, lcase 将字符串中的ASCII拉丁符号转换为小写。 示例:select lcase('I Love Beijing');
返回:i love beijing
upper, ucase 将字符串中的ASCII拉丁符号转换为大写  
lowerUTF8 将包含UTF8编码的字符串转换为小写。  
upperUTF8 将包含UTF8编码的字符串转换为大写。  

 

 

 

4. valid函数

isValidUTF8 如果字节集合时有效的UTF-8编码,则返回1, 否则返回0。  
toValidUTF8 用"� (U+FFFD) "字符串替换无效的UTF-8编码。返回有效的UTF-8字符串。 示例:SELECT toValidUTF8('\x61\xF0\x80\x80\x80b')
返回: a�b  

 

5. 字符串拼接、截取

repeat 将字符串重复指定的次数。语法:repeat(s, n),s为要重复的字符串,n为重复的次数。如果n<1,则返回空字符串。 示例:select repeat('abc',3);
返回:abcabcabc
reverse 按照字节序列反转字符串。 示例:select reverse('bei');
返回:ieb
reverseUTF8 按照UTF-8编码反转字符串。 示例:select reverseUTF8('北京');
返回:京北
format(pattern, s0, s1, …) 使用参数中的字符串格式化常量pattern。格式字符串包含用花括号{}括起来的“替换字段”。不在花括号中的所有内容视为文本,该文本按原样输出。如果文字文本中要包含花括号,使用两个{{和}}转义。字段名可以是从零开始的数字或空。 示例1:SELECT format('{1} {0} {1}', 'World', 'Hello');
返回:Hello World Hello
示例2:SELECT format('{} {}', 'Hello', 'World');
返回:Hello World
concat 连接参数中列出的字符串,不带分隔符。语法:concat(s1, s2, ...)。如果任何参数值为NULL,则结果为NULL。 示例:SELECT concat('Hello, ', 'World!') ;
返回:Hello, World!
concatAssumeInjective 语法:concatAssumeInjective(s1, s2, ...)。
用于连接参数中列出的字符串。与concat的不同之处在于需确保concat(s1, s2, ...) → sn是单射(设f是由集合A到集合B的映射,如果所有x,y∈A,且x≠y,都有f(x)≠f(y),则称f为由A到B的单射。)。这里的单射即不同的参数值总是返回不同的结果。
用于优化GROUP BY。
示例:
CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog;
INSERT INTO key_val VALUES ('Hello, ','World',1), ('Hello, ','World',2), ('Hello, ','World!',3), ('Hello',', World!',2);
SELECT * from key_val;
聚合语句:
select con, val, lengthUTF8(con) as len from (select concat(key1, key2) as con, sum(value) as val FROM key_val GROUP BY concatAssumeInjective(key1, key2)) ;
返回:
┌─con─────┬─val┬─len─┐
│ Hello, World! │   3  │     13 │
│ Hello, World! │   2  │     13 │
│ Hello, World  │   3  │     12 │
└────────┴───┴────┘
substring(s, offset, length)
mid(s, offset, length)
substr(s, offset, length)
字符串截取, s为源字符串, offset为字节偏移量,length为截取的长度。
Note:字符索引从1开始。
示例:select substr('abcd',1,2);
返回:ab
substringUTF8(s, offset, length) UTF-8编码的字符串截取。  
appendTrailingCharIfAbsent(s, c) 如果“s”字符串不是空的,并且结尾不包含“c”字符,则在结尾处追加“c”字符。 示例:select appendTrailingCharIfAbsent('ab','e');
返回:abe
endsWith(s, suffix) 判断字符串是否以指定后缀结尾。如果字符串以指定后缀结尾,则返回1,否则返回0。  
startsWith(str, prefix) 判断字符串是否以指定前缀开头。如果字符串以指定前缀开头,则返回1,否则返回0。 示例:SELECT startsWith('Hello, world!', 'He');
返回:1
trim 从字符串的开头或结尾删除所有指定的字符。默认情况下, 从字符串的两端删除所有连续出现的空格。
语法:trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) 。
参数:
  • trim_character指定要修剪的字符,参数类型为字符串。
  • input_string参数指定要修剪的字符串。
示例:select trim(BOTH '<> ' from ' <ClickHouse >') as trim_str;
返回:ClickHouse
trimLeft 从字符串开头删除所有连续出现的空格。它不会删除其他种类的空白字符(如制表符等)。  
trimLeft 从字符串结尾删除所有连续出现的空格。它不会删除其他种类的空白字符(如制表符等)。  
trimBoth 从字符串两端删除所有连续出现的空格。它不会删除其他种类的空白字符(如制表符等)。  

 

 

6.  编码转换

函数 描述 示例
convertCharset(s, from, to) 将字符串s从from编码转换为to编码。 示例:select convertCharset('我爱北京', 'utf8', 'gbk') as gbk_str, convertCharset(gbk_str, 'gbk', 'utf8') as utf8_str;
返回:
┌─gbk_str───┬─utf8_str─┐
 │ ϒ°®±±¾©     │ 我爱北京 │
└─────────┴──────┘
base64Encode(s) 将's'字符串编码为base64。 示例:select base64Encode('a');
返回:YQ==
base64Decode(s) 将base64编码的字符串's'解码为原始字符串。如果解码失败,将引发异常。 示例:select base64Decode('YQ==');
返回:a
tryBase64Decode(s) 解码base64编码的字符串, 如果发生错误,则返回一个空字符串。  

 

7. CRC校验

 

函数 描述 示例
CRC32(s) 使用CRC-32-IEEE 802.3多项式和初始值0xffffffff(zlib实现)计算字符串的CRC32校验和。
返回类型为UInt32。
 
CRC32IEEE(s) 使用CRC-32-IEEE 802.3多项式计算字符串的CRC32校验和。
返回类型为UInt32。
 
CRC64(s) 使用CRC-64-ECMA多项式计算字符串的CRC32校验和。
返回类型为UInt64。
示例:select CRC64('ab');
返回:18335630415216175809

 

 

1. 算术函数   

2. 比较函数   

3. 逻辑函数

 

1. 算术函数

 

函数 对应操作符 描述
plus(a, b) a + b 对两个数字求和。也可以对date/dateTime类型值与整型值(表示秒数)求和。
minus(a, b),  a - b 支持date/dateTime类型值与整型值(表示秒数)相减。
multiply(a, b) a * b 数字乘积。
divide(a, b) a / b 计算数字的商,结果为浮点类型。当除以0时,结果为inf、-inf和nan。
intDiv(a, b) 计算数字的商,结果为四舍五入后的整型。当除以0或最小负数除以负1时,将引发异常。
intDivOrZero(a, b) intDiv的扩展。当除以0或最小负数除以负1时,返回0。
modulo(a, b) a % b 计算余数。如果参数是浮点数,则会删除小数部分将其转换为整数。
negate(a) -a 数值取发。
abs(a)   取绝对值。
gcd(a, b)   最大公约数
lcm(a, b)   最小公倍数

 

 

 

2. 比较函数

 

1. 比较函数返回的结果为0或1, 数据类型UInt8。

2. 可以参与比较的数据类型为:

  • numbers
  • strings和fixed strings
  • dates
  • dates with times

只能在每组之内进行比较,不能在不同组之间进行比较。例如,不能将date类型和string类型进行比较。

函数 操作符
equals  a = b 和 a == b
notEquals a ! = b 和 a <> b
less <
greater >
lessOrEquals <=
greaterOrEquals >=

 

3. 逻辑函数

 

逻辑函数接受任何数值类型的参数, 返回0或1的UInt8数字。

参数0视为false, 其他任何非0参数视为true。

  • and, and操作符
  • or, or操作符
  • not, NOT操作符
  • xor

 

1. 数值/日期类转换

1.1 常规类型转换

1.2 -OrZero系列

 1.3 -OrNull系列

2. 字符串转换

3. 通用的转换函数CAST(x, t)

4. 时间相关转换

 

 

1. 数值/日期类转换

1.1 常规类型转换

大类 细类 描述
toInt(8|16|32|64) toInt8(expr) 转换为有符号的整数,转换向零舍入(截断数字的小数位)。nan和inf未定义。
toInt16(expr)
toInt32(expr)
toInt64(expr)
toUInt(8|16|32|64) toUInt8(expr) 转换为无符号的整数,转换向零舍入(截断数字的小数位)。nan和inf未定义。
如果传入参数为负数,转换将异常。
toUInt16(expr)
toUInt32(expr)
toUInt64(expr)

toFloat(32|64)

toFloat32(expr) 转换为浮点数。
toFloat64(expr)
toDecimal(32|64|128) toDecimal32(value, S) 将值转换为精度为S的Decimal数据类型。该值可以是数字或字符串。 S(比例)参数指定小数位数。
toDecimal64(value, S)
toDecimal128(value, S)
toDate toDate(expr) 标准的时间格式字符串。
toDateTime toDateTime(expr) 标准的时间格式字符串或Unix时间戳。

 

 

1.2  -OrZero系列

与常规的数据类型转换相比, -OrZero可以处理异常情况, 当转换失败时,则返回0。

注意:这里只能接收字符串的参数。
 

大类 细类 描述
toInt(8|16|32|64)OrZero toInt8OrZero(expr)  
toInt16OrZero(expr)
toInt32OrZero(expr)
toInt64OrZero(expr)
toUInt(8|16|32|64)OrZero toUInt8OrZero(expr)  
toUInt16OrZero(expr)
toUInt32OrZero(expr)
toUInt64OrZero(expr)

toFloat(32|64)OrZero

toFloat32OrZero(expr)  
toFloat64OrZero(expr)
toDecimal(32|64|128)OrZero toDecimal32OrZero(value, S) 如下两种情况会导致转换异常:
1. 当不能将字符串转换为数字。
2. 能将字符串转换为数字, 但是精度超过S。
toDecimal64OrZero(value, S)
toDecimal128OrZero(value, S)
toDateOrZero toDateOrZero(expr) 日期转换异常不会返回0, 而是返回混乱的日期。
toDateTimeOrZero toDateTimeOrZero(expr)

 

 

1.3  -OrNull系列

与常规的数据类型转换相比, -OrNull可以处理异常情况, 当转换失败时,则返回Nulll。

注意:这里只能接收字符串的参数。

大类 细类 描述
toInt(8|16|32|64)OrNull toInt8OrNull(expr)  
toInt16OrNull(expr)
toInt32OrNull(expr)
toInt64OrNull(expr)
toUInt(8|16|32|64)OrNull toUInt8OrNull(expr)  
toUInt16OrNull(expr)
toUInt32OrNull(expr)
toUInt64OrNull(expr)

toFloat(32|64)OrNull

toFloat32OrNull(expr)  
toFloat64OrNull(expr)
toDecimal(32|64|128)OrNull toDecimal32OrNull(value, S) 如下两种情况会导致转换异常:
1. 当不能将字符串转换为数字。
2. 能将字符串转换为数字, 但是精度超过S。
toDecimal64OrNull(value, S)
toDecimal128OrNull(value, S)
toDateOrNull toDateOrNull(expr) 日期转换异常不会返回0, 而是返回混乱的日期。
toDateTimeOrNull toDateTimeOrNull(expr)

 

2. 字符串转换

函数 描述
toString

将数字、字符串(非固定长度字符串)、date和datetime数据类型转换为字符串。

当将日期转换为字符串时,可额外增加第二个参数,用于指定时区。

toFixedString(s, N) 将String类型的参数转换为FixedString(N)类型(固定长度为N的字符串),N必须为常数。如果字符串的字节数少于N,则在字符串右侧填充空字符串。如果字符串字节数大于N,则会转换异常。
toStringCutToZero(s) 接受String或Fixed参数,在字符串参数的第一个0字节处被截断,返回截断后的字符串。

 

 

3. 通用的转换函数CAST(x, t)

将"x"转换为"t"数据类型。 也可以写成: CAST(x as t) 。

可以将类型转换为Nullable 。

 

4. 时间相关转换

 

4.1 toInterval(Year|Quarter|Month|Week|Day|Hour|Minute|Second)

将数字类型转换为Interval数据类型。

 

1

toIntervalSecond(number)

2

toIntervalMinute(number)

3

toIntervalHour(number)

4

toIntervalDay(number)

5

toIntervalWeek(number)

6

toIntervalMonth(number)

7

toIntervalQuarter(number)

8

toIntervalYear(number)

 

 

 

4.2 日期解析

将数字类型参数解析为Date或DateTime类型。 与toDate和toDateTime不同,parseDateTimeBestEffort可以处理更复杂的日期格式。 

函数 描述
parseDateTimeBestEffort  
parseDateTimeBestEffortOrNull 对于无法处理的格式,则返回Null。
parseDateTimeBestEffortOrZero 对于无法处理的格式,则返回0。

 

 

 

select '20180831145618' as time, parseDateTimeBestEffort(time);

 

 

日期计算

日期转换相关函数

 

1. 日期计算

1.1 toStartOfInterval函数

返回一个时间单位的开始时间。

toStartOfInterval(time_or_data, INTERVAL x unit [, time_zone])

toStartOfInterval(t, INTERVAL 1 year) 与toStartOfYear(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 1 month) 与toStartOfMonth(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 1 day) 与toStartOfDay(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 15 minute) 与toStartOfFifteenMinutes(t) 返回相同的结果。

示例:toStartOfInterval(toDateTime('2020-04-22 15:21:35'), INTERVAL 15 minute)

 

1.2 add*/subtract*函数

add*函数用于给日期或时间添加一个时间间隔,subtract*函数用于给日期或时间减去一个时间间隔。

add*函数包含:ddYears, addMonths, addWeeks, addDays, addHours, addMinutes, addSeconds, addQuarters 。

subtract*函数包含:subtractYears, subtractMonths, subtractWeeks, subtractDays, subtractHours, subtractMinutes, subtractSeconds, subtractQuarters 。

 

 

1.3 dateDiff

用于计算两个Date或DateTime值之间的差。

语法:

 

1

dateDiff('unit', startdate, enddate, [timezone])

参数:

  • unit,时间单位,返回值使用该单位表示,取值:second、minute、hour、day、week、month、quarter、year 。
  • startdate:用于比较的第一个时间。
  • enddate:用于比较的第二个时间。
  • timezone:可选参数,指定时区。

 

1.4 日期格式化

使用Format格式化时间,返回字符串类型。

 

1

formatDateTime(Time, Format[, Timezone])

格式的含义如下:

Modifier Description Example
%C year divided by 100 and truncated to integer (00-99) 20
%d day of the month, zero-padded (01-31) 2
%D Short MM/DD/YY date, equivalent to %m/%d/%y 2001/2/18
%e day of the month, space-padded ( 1-31) 2
%F short YYYY-MM-DD date, equivalent to %Y-%m-%d 2018/1/2
%H hour in 24h format (00-23) 22
%I hour in 12h format (01-12) 10
%j day of the year (001-366) 2
%m month as a decimal number (01-12) 1
%M minute (00-59) 33
%n new-line character ('\n')  
%p AM or PM designation PM
%R 24-hour HH:MM time, equivalent to %H:%M 22:33
%S second (00-59) 44
%t horizontal-tab character ('\t')  
%T ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S 22:33:44
%u ISO 8601 weekday as number with Monday as 1 (1-7) 2
%V ISO 8601 week number (01-53) 1
%w weekday as a decimal number with Sunday as 0 (0-6) 2
%y Year, last two digits (00-99) 18
%Y Year 2018
%% a % sign %

 

 

 

 

 

 

 

2. 日期转换相关函数

 

函数 描述 使用示例
toTimeZone 将时间/日期转换到指定的时区。 示例:toTimeZone(toDateTime('2020-03-22 10:00:00'), 'US/Samoa')
返回:2020-03-21 15:00:00
toYear 将日期/时间转换为包含年份数字(AD)的UInt16数字。 示例:toYear(toDateTime('2020-03-22 10:00:00'))
示例:返回:2020
toQuarter 计算时间所在的季度。季度从1开始计数。 示例:toQuarter(toDateTime('2020-04-22 10:00:00'))
返回:2
toMonth 将时间转换为月份数(1-12)。 示例:toMonth(toDateTime('2020-04-22 10:00:00'))
返回:4
toDayOfYear 转换为所在年度的天数字(1-366) 示例:toDayOfYear(toDateTime('2020-04-22 10:00:00'))
返回:113
toDayOfMonth 转换为所在月的天数字(1-31) 示例:toDayOfMonth(toDateTime('2020-04-22 10:00:00'))
返回:22
toDayOfWeek 转换为所在周的天数字(1-7),1时周一,7是周日。 示例:toDayOfWeek(toDateTime('2020-04-22 10:00:00'))
返回:3
toHour 转换为小时的时间数字(0-23),类型为UInt8。 示例:toHour(toDateTime('2020-04-22 16:25:30'))
返回:16
toMinute 转换为分钟时间数字(0-59),类型为UInt8。 示例:toMinute(toDateTime('2020-04-22 16:25:30'))
返回:25
toSecond 转换为秒数的时间数字(0-59),类型为UInt8。 示例:toSecond(toDateTime('2020-04-22 16:25:30'))
返回:30
toUnixTimestamp 转换Unix时间戳,类型为UInt32。 示例1:toUnixTimestamp(toDateTime('2020-04-22 16:25:30'))
返回:1587543930
示例2:toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo')
返回:1509836867
toStartOfYear 将日期或时间舍入到一年中的第一天,返回类型为Date。 示例:toStartOfYear(toDateTime('2020-01-01 00:00:00'))
返回:2020-01-01
toStartOfISOYear 将日期或时间舍入到ISO年中的第一天,返回类型为Date。 示例:toStartOfISOYear(toDateTime('2020-01-01 00:00:00'))
返回:2019-12-30
toStartOfQuarter 将日期或时间舍入到季度的第一天,四个季度的第一天分别为:1月1日、4月1日、7月1日和10月1日。返回类型为Date。 示例:toStartOfQuarter(toDateTime('2020-03-21 00:00:00'))
返回:2020-01-01 
toStartOfMonth 将日期或时间舍入到月度的第一天。返回类型为Date。 示例:toStartOfMonth(toDateTime('2020-04-22 00:00:00'))
返回:2020-04-01
toMonday 将日期或时间舍入到最近的周一。返回类型为Date。 示例:toMonday(toDateTime('2020-04-26 00:00:00'))
返回:2020-04-20
toStartOfWeek(t[,mode]) 根据mode参数,将日期舍入到最近的周一或周日。返回类型为Date。 示例:toStartOfWeek(toDateTime('2020-04-22 00:00:00'), 3)
返回:2020-04-20
toStartOfDay 将日期舍入到一天的开始时间, 返回类型为DateTime。 示例:toStartOfDay(toDateTime('2020-04-22 15:20:00'))
返回:2020-04-22 00:00:00
toStartOfHour 将日期舍入到小时的开始时间, 返回类型为DateTime。 示例:toStartOfHour(toDateTime('2020-04-22 15:20:00'))
返回:2020-04-22 15:00:00
toStartOfMinute 将日期舍入到分钟的开始时间, 返回类型为DateTime。 示例:toStartOfMinute(toDateTime('2020-04-22 15:21:35'))
返回:2020-04-22 15:21:00
toStartOfFiveMinute 将日期舍入到5分钟间隔的开始时间, 返回类型为DateTime。 示例:toStartOfFiveMinute(toDateTime('2020-04-22 15:21:35'))
返回:2020-04-22 15:20:00
toStartOfTenMinutes 将日期舍入到10分钟间隔的开始时间, 返回类型为DateTime。 示例:toStartOfTenMinutes(toDateTime('2020-04-22 15:21:35'))
返回:2020-04-22 15:20:00
toStartOfFifteenMinutes 将日期舍入到15分钟间隔的开始时间, 返回类型为DateTime。 示例:toStartOfFifteenMinutes(toDateTime('2020-04-22 15:21:35'))
返回:2020-04-22 15:15:00
toStartOfInterval(time_or_data, INTERVAL x unit [, time_zone]) toStartOf*函数的泛化形式,更灵活。
toStartOfInterval(t, INTERVAL 1 year) 与toStartOfYear(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 1 month) 与toStartOfMonth(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 1 day) 与toStartOfDay(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 15 minute) 与toStartOfFifteenMinutes(t) 返回相同的结果。
示例:toStartOfInterval(toDateTime('2020-04-22 15:21:35'), INTERVAL 15 minute)
返回:2020-04-22 15:15:00
toRelativeYearNum 从过去某个时间点起的年数。从公元0年开始起。 示例:toRelativeYearNum(toDateTime('2020-04-22 15:21:35'))
返回:2020
toRelativeQuarterNum 从过去某个时间点起的季度数。从公元0年开始起。 示例:toRelativeQuarterNum(toDateTime('2020-04-22 15:21:35'))
返回:8081
toRelativeMonthNum 从过去某个时间点起的月数。从公元0年开始起。 示例:toRelativeMonthNum(toDateTime('2020-04-22 15:21:35'))
返回:24244
toRelativeWeekNum 从过去某个时间点起的周数。从1970年01月01日00时00分00秒起。 示例:toRelativeWeekNum(toDateTime('2020-04-22 15:21:35'))
返回:2625
toRelativeDayNum 从过去某个时间点起的天数。从1970年01月01日00时00分00秒起。 示例:toRelativeDayNum(toDateTime('2020-04-22 15:21:35'))
返回:18374
toRelativeHourNum 从过去某个时间点起的小时数。从1970年01月01日00时00分00秒起。 示例:toRelativeHourNum(toDateTime('2020-04-22 15:21:35'))
返回:440983
toRelativeMinuteNum 从过去某个时间点起的分钟数。从1970年01月01日00时00分00秒起。 示例:toRelativeMinuteNum(toDateTime('2020-04-22 15:21:35'))
返回:26459001
toRelativeSecondNum 从过去某个时间点起的秒数。从1970年01月01日00时00分00秒起。 示例:toRelativeSecondNum(toDateTime('2020-04-22 15:21:35'))
返回:1587540095
toISOYear 将日期或时间转换为ISO年份号的UInt16类型数字。 示例:toISOYear(toDateTime('2020-04-22 15:21:35'))
返回:2020
toISOWeek 将日期或时间转换为ISO周数的UInt8类型数字。 示例:toISOWeek(toDateTime('2020-01-01 15:21:35'))
返回:1
toWeek(date[,mode]) 返回日期或时间的周数。第二个参数mode指定一周从周一或周日开始,以及返回值在0-53或1-53之间。mode默认值为0。当mode为3, 相当于toISOWeek。
具体参见mode部分的解析。
示例:toWeek(toDateTime('2020-01-01 15:21:35'))
返回:0
toYearWeek(date[,mode]) 返回date的年和周。mode指定了周的计算方式。具体参见mode部分的解析。
toISOYear()等价于intDiv(toYearWeek(date,3),100)。
示例:toYearWeek(toDate('2016-01-02'), 0) as mode0, toYearWeek(toDate('2016-01-02'), 2) as mode2
返回:
┌──mode0─┬──mode2─┐
│     201552  │ 201552      │
└───────┴───────┘
now 返回请求执行的当前时刻的时间 示例:now()
返回:2020-04-22 12:40:56
today 返回请求执行的当前时刻的日期 示例:today()
返回:2020-04-22 
yesterday 返回请求执行的当前时刻的前一天日期。等价于: today() - 1 。 示例:yesterday()
返回:2020-04-21
timeSlot 将时间舍入为半小时。 示例:timeSlot(toDateTime('2020-04-22 12:29:20')) as half1, timeSlot(toDateTime('2020-04-22 12:31:20')) half2;
返回:
┌───────half1────┬──────half2─────┐
│ 2020-04-22 12:00:00  │ 2020-04-22 12:30:00 │
└──────────────┴──────────────┘
toYYYYMM 将日期或时间转换为包含年份和月份的数字(YYYY * 100 + MM),类型为UInt32。 示例:toYYYYMM(toDateTime('2020-04-22 12:31:20'))
返回:202004
toYYYYMMDD 将日期或时间转换为包含年份和月份的数字(YYYY * 10000 + MM*100 + DD),类型为UInt32。 示例:toYYYYMMDD(toDateTime('2020-04-22 12:31:20'))
返回:20200422
toYYYYMMDDhhmmss 将日期或时间转换为包含年份和月份的数字(YYYY * 10000000000 + MM * 100000000 + DD * 1000000 + hh * 10000 + mm * 100 + ss),类型为UInt64。 示例:toYYYYMMDDhhmmss(toDateTime('2020-04-22 12:31:20'))
返回:20200422123120

 

 

 

关于日期转换函数的mode参数:

Mode 一周的第一天 范围 第一周计算方法
0 Sunday 0-53 如果包含1月1日的一周在新年中有一个周日,则为第1周。否则为上一年的最后一周,而下周为第1周。
1 Monday 0-53 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。
2 Sunday 1-53 如果包含1月1日的一周在新年中有一个周日,则为第1周。否则为上一年的最后一周,而下周为第1周。
3 Monday 1-53 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。
4 Sunday 0-53 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。
5 Monday 0-53 如果包含1月1日的一周在新年中有一个周一,则为第1周。否则为上一年的最后一周,而下周为第1周。
6 Sunday 1-53 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。
7 Monday 1-53 如果包含1月1日的一周在新年中有一个周一,则为第1周。否则为上一年的最后一周,而下周为第1周。
8 Sunday 1-53 包含1月1日的那周为第一周。
9 Monday 1-53 包含1月1日的那周为第一周。

 

关于mode0和mode2的区别:

mode0和mode2的每周都是以周日开始,它们第一周的计算方式也完全一样,但是日期的范围不一样,即第一周之前的周数一个显示为0, 一个显示为上一年度的周数。

日期 周数
toWeek(toDate('2016-01-03'), 0) 1
toWeek(toDate('2016-01-03'), 2) 1
toWeek(toDate('2016-01-02'), 0) 0
toWeek(toDate('2016-01-02'), 2) 52

 

但是与toYearWeek有差异:

日期 周数
toYearWeek(toDate('2016-01-03'), 0) 201601
toYearWeek(toDate('2016-01-03'), 2) 201601
toYearWeek(toDate('2016-01-02'), 0) 201552
toYearWeek(toDate('2016-01-02'), 2) 201552

 

1. 字符串搜索 

从字符串中查找子字符串的位置,默认以字节为单位和大小写敏感,

使用衍生的*CaseInsensitive和*UTF8函数进行不区分大小写和UTF8编码的字符串搜索。

在搜索时同时使用忽略大小写和使用UTF8编码的规则,则使用衍生的*CaseInsensitiveUTF8函数。

位置索引从1开始。

 

 (1)、singe search

函数 描述 示例
position(haystack, needle)
locate(haystack, needle)
以字节为单位,在字符串haystack中搜索子字符串needle。 示例:SELECT position('Hello, world!', '!');
返回:13
positionCaseInsensitive 字符串搜索不区分大小写。 示例:SELECT positionCaseInsensitive('Hello, world!', 'L');
返回:3
positionUTF8 以UTF8编码单位,搜索字符串。 示例:SELECT positionUTF8('中国北京', '北');
返回:3
positionCaseInsensitiveUTF8 以UTF8编码单位,不缺分大小写,搜索字符串。  

 

(2)、multiSearch

 

函数 描述 示例
multiSearchAllPositions 语法:
multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen])。
搜索子字符串数组中的元素在字符串中出现的位置,返回子字符串对应的位置数组。
示例:SELECT multiSearchAllPositions('Hello, World!', ['Hello', '!', 'world']);
返回:[1,13,0]
 
multiSearchAllPositionsUTF8 与函数multiSearchAllPositions功能相同,只是使用UTF8编码单位进行搜索。  
multiSearchFirstPosition(haystack, [needle1, needle2, …, needlen]) 返回匹配的最左边的偏移量。
返回类型为UInt64。
大小写和UTF8编码的相关的衍生函数:
multiSearchFirstPositionCaseInsensitive, multiSearchFirstPositionUTF8, multiSearchFirstPositionCaseInsensitiveUTF8。
示例:SELECT multiSearchFirstPosition('Hello, World!', ['Hello', '!', 'world']);
返回:1
multiSearchFirstIndex(haystack, [needle1, needle2, …, needlen]) 搜索子字符串数组中的元素在字符串中出现的位置,返回第一个匹配的数组索引。
大小写和UTF8编码的相关的衍生函数:
multiSearchFirstIndexCaseInsensitive, multiSearchFirstIndexUTF8, multiSearchFirstIndexCaseInsensitiveUTF8。
示例:SELECT multiSearchFirstIndex('Hello, World!', ['AB', '!', 'He']);
返回:2
数组中的第二个元素"!"第一次匹配字符串。
multiSearchAny(haystack, [needle1, needle2, …, needlen]) 搜索子字符串数组中的元素在字符串中出现的位置。如果至少有一个子字符串匹配,则返回1,否则返回0。大小写和UTF8编码的相关的衍生函数:multiSearchAnyCaseInsensitive, multiSearchAnyUTF8, multiSearchAnyCaseInsensitiveUTF8。 示例:SELECT multiSearchAny('Hello, World!', ['AB', '!', 'He']);
返回:1

 

 

2. 正则表达式匹配

检查字符串是否与正则表达式匹配。

正则表达式使用re2的语法。

反斜杠符号(\)用于在正则表达式中转义,为了转义表达式中的符号,必须在字符串文本中使用双斜杠。

在字符串中搜索子字符串,最好使用LIKE或position,它们能提供更快的性能。

re2正则表达式语法:https://github.com/google/re2/wiki/Syntax 。

 

函数 描述 示例
match(haystack, pattern) 检查字符串是否与正则表达式匹配。如果匹配则返回1,否则返回0。 示例:select match('Hello','ll');
返回:1
multiMatchAny(haystack, [pattern1, pattern2, …, patternn]) 使用一个pattern数组的元素分别匹配字符串,如果没有匹配的正则表达式,则返回0。如果任何一个pattern匹配,则返回1。 示例:select multiMatchAny('Hello World',['W','a','o']);
返回:1
multiMatchAnyIndex(haystack, [pattern1, pattern2, …, patternn]) 使用一个pattern数组的元素分别匹配字符串,如果没有匹配的正则表达式,则返回0。如果任何一个pattern匹配,则匹配的pattern数组的索引。 示例:select multiMatchAnyIndex('Hello World',['W','e']);
返回:2
multiMatchAllIndices(haystack, [pattern1, pattern2, …, patternn]) 使用一个pattern数组的元素分别匹配字符串,返回所有匹配的pattern的元素的数组下标。 示例:select multiMatchAllIndices('Hello World',['W','a','o']);
返回:[3,1]
extract(haystack, pattern) 使用正则表达式提取字符串的片段。如果不匹配,则返回空字符串。如果regex不含子模式,则它将获取与整个regex匹配的片段,否则,它将获取第一个子模式匹配的片段。 示例1:select extract('China,Chinese','Chin[a|e]') ;
返回:China
示例2:select extract('China Node,Chinese Note','(Chin[a|e]) (No[t|d]e)') ;
返回:China
extractAll(haystack, pattern) 使用正则表达式提取所有字符串的片段。如果不匹配,则返回空字符串。如果regex不含子模式,则它将获取与整个regex匹配的片段,否则,它将获取第一个子模式匹配的片段。 示例1:select extractAll('China,Chinese','Chin[a|e]')
返回:['China','Chine']
示例2:select extractAll('China-Node,Chinese-Note','(Chin[a|e])-') ;
返回:['China'] 

 

 

3. like函数

检查字符串是否与pattern匹配,patter可包含两个符号:_和%。

_表示任意一个字节的占位。

%表示任何字节的任何数量(包括零个字符)

 

函数 描述 示例
like(haystack, pattern) 相同语义的操作符:" haystack LIKE pattern"。 示例:select like('I Love China','%Love%') ;
返回:1
notLike(haystack, pattern) like的取反。  

 

 

 

1. replaceOne(haystack, pattern, replacement)

使用子字符串"pattern"匹配字符串"haystack", 将字符串中的第一个匹配项(如果存在)替换为"replacement"子字符串。

"pattern"和"replacement"必须是常量。 

 

2. replaceAll(haystack, pattern, replacement), replace(haystack, pattern, replacement)

将"haystack"中所有出现的"pattern"的子字符串替换为"replacement"子字符串。

 

3. replaceRegexpOne(haystack, pattern, replacement)

使用"pattern"正则表达式进行替换,正则表达式使用re2语法。

仅替换第一个匹配项(如何存在)。

pattern可以指定为"replacement", 这个pattern可以包括替换项: \0-\9。 替换项\0包括整个正则表达式,替换项\1-\9对应于子pattern。如果要在模板中使用\字符,使用\对其进行转义(即使用双斜杠)。

 

4. replaceRegexpAll(haystack, pattern, replacement)

替换所有出现的子字符串。

 

5. regexpQuoteMeta(s)

在预定义的字符之前添加反斜杠。

预定义字符: ‘0’,  ‘\’,   ‘|’,   ‘(’,   ‘)’,   ‘^’,   ‘$’,   ‘.’,   ‘[’,   ’]’,   ‘?’,   ’*‘,  ’+‘,  ’{‘,  ’:‘,  ’-’。

 

全部评论