前提介绍
字段类型分类概览
sql
ClickHouse数据类型
├── 基础类型
│ ├── 整数类型 (Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int128, UInt128, Int256, UInt256) --分为有/无符号整数
│ ├── 浮点类型 (Float32, Float64)
│ ├── 小数类型 (Decimal32, Decimal64, Decimal128, Decimal256)
│ ├── 布尔类型 (Bool)
│ └── 字符串类型 (String, FixedString)
├── 时间类型
│ ├── 日期类型 (Date, Date32)
│ ├── 时间类型 (DateTime, DateTime64)
│ └── 时间间隔 (Interval)
├── 复合类型
│ ├── 数组类型 (Array(T))
│ ├── 元组类型 (Tuple(T1, T2, ...))
│ ├── 嵌套类型 (Nested)
│ ├── 映射类型 (Map(key, value))
│ └── 结构类型 (Object)
├── 特殊类型
│ ├── 可空类型 (Nullable(T))
│ ├── 枚举类型 (Enum8, Enum16)
│ ├── UUID类型 (UUID) -- 存id类数据,全局唯一标识符
│ ├── IP类型 (IPv4, IPv6) --存ip类数据,192.168.1.1
│ ├── 聚合函数类型 (AggregateFunction)
│ └── 域类型 (Domain)
└── 别名类型
└── 类型别名


常用日期格式
sql
%Y- 4位年份
%m- 月份(01-12)
%d- 日期(01-31)
%H- 小时(00-23)
%M- 分钟(00-59)
%S- 秒(00-59)
ch年月日:%Y-%m-%d %H-%M-%S
hive年月日:yyyy-MM-dd HH:mm:ss
一、时间或日期截取函数
1、返回值为非日期
toTime()、toYear()、toMonth()、toMonday()、toDayofMonth()、toDayofWeek()、toHour()、toMinutes()、toSecond()
此类函数从日期或日期时间中提取特定部分,返回结果为数字或时间,而非完整日期。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
toTime(datetime) |
从DateTime中提取时间部分。 | SELECT toTime('2026-03-15 14:30:45') AS time_part; |
1970-01-01 14:30:45 |
toYear(date/datetime) |
提取日期或日期时间的年份。 | SELECT toYear('2026-03-15') AS year; SELECT toYear('2026-03-15 14:30:45') AS year; |
2026 |
toMonth(date/datetime) |
提取月份(1-12)。 | SELECT toMonth('2026-03-15') AS month; SELECT toMonth('2026-12-31 23:59:59') AS month; |
3 12 |
toMonday(date/datetime) |
返回包含指定日期的周一的日期。 | SELECT toMonday('2026-03-15') AS monday; SELECT toMonday('2026-03-10') AS monday; |
2026-03-09 |
toDayOfMonth(date/datetime) |
提取一个月中的第几天(1-31)。 | SELECT toDayOfMonth('2026-03-15') AS day; SELECT toDayOfMonth('2026-02-28') AS day; |
15 28 |
toDayOfWeek(date/datetime) |
提取一周中的第几天(周一为1,周日为7)。 | SELECT toDayOfWeek('2026-03-15') AS day_of_week; SELECT toDayOfWeek('2026-03-16') AS day_of_week; |
7 1 |
toHour(date/datetime) |
提取小时(0-23)。 | SELECT toHour('2026-03-15 14:30:45') AS hour; SELECT toHour('2026-03-15 00:00:00') AS hour; |
14 0 |
toMinute(date/datetime) |
提取分钟(0-59)。 | SELECT toMinute('2026-03-15 14:30:45') AS minute; SELECT toMinute('2026-03-15 14:05:00') AS minute; |
30 5 |
toSecond(date/datetime) |
提取秒(0-59)。 | SELECT toSecond('2026-03-15 14:30:45') AS second; SELECT toSecond('2026-03-15 14:30:00') AS second; |
45 0 |
2、返回值为日期的起始时间函数
timeSlot()、toStartOfYear()、toStartOfMonth()、toStartOfDay()、toStartOfHour()、toStartOfQuarter()、toStartOfFifteenminnutes()、toStartOfMinutes()
此类函数用于将日期或日期时间截取/规整到特定的起始点,返回结果为日期或日期时间类型。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
timeSlot(datetime) |
将时间向下取整到最近的半小时时间槽的起始点。 | SELECT timeSlot('2026-03-15 14:30:45') AS slot; SELECT timeSlot('2026-03-15 14:45:00') AS slot; |
2026-03-15 14:30:00 2026-03-15 14:30:00 |
toStartOfYear(date/datetime) |
返回指定日期所在年份的第一天。 | SELECT toStartOfYear('2026-03-15') AS year_start; SELECT toStartOfYear('2026-12-31 23:59:59') AS year_start; |
2026-01-01 |
toStartOfMonth(date/datetime) |
返回指定日期所在月份的第一天。 | SELECT toStartOfMonth('2026-03-15') AS month_start; SELECT toStartOfMonth('2026-02-28') AS month_start; |
2026-03-01 2026-02-01 |
toStartOfDay(date/datetime) |
返回指定日期的当天起始时间(00:00:00)。 | SELECT toStartOfDay('2026-03-15') AS day_start; SELECT toStartOfDay('2026-03-15 14:30:45') AS day_start; |
2026-03-15 00:00:00 |
toStartOfHour(date/datetime) |
返回指定日期时间所在小时的起始点。 | SELECT toStartOfHour('2026-03-15 14:30:45') AS hour_start; SELECT toStartOfHour('2026-03-15 00:00:00') AS hour_start; |
2026-03-15 14:00:00 2026-03-15 00:00:00 |
toStartOfQuarter(date/datetime) |
返回指定日期所在季度的第一天。 | SELECT toStartOfQuarter('2026-03-15') AS quarter_start; SELECT toStartOfQuarter('2026-11-15') AS quarter_start; |
2026-01-01 2026-10-01 |
toStartOfFifteenMinutes(datetime) |
将时间向下取整到最近15分钟的起始点。 | SELECT toStartOfFifteenMinutes('2026-03-15 14:30:45') AS fifteen_start; SELECT toStartOfFifteenMinutes('2026-03-15 14:42:00') AS fifteen_start; |
2026-03-15 14:30:00 2026-03-15 14:30:00 |
toStartOfMinute(datetime) |
返回指定日期时间所在分钟的起始点。 | SELECT toStartOfMinute('2026-03-15 14:30:45') AS minute_start; SELECT toStartOfMinute('2026-03-15 14:30:00') AS minute_start; |
2026-03-15 14:30:00 |
注意:
- timeSlot` 函数固定按30分钟(半小时)的间隔进行规整,常用于将时间划分为固定的时间槽进行聚合分析。
- 季度划分 :
toStartOfQuarter将一年划分为四个季度(1-3月、4-6月、7-9月、10-12月),并返回每个季度第一天的日期。 toStartOfFifteenMinutes将时间规整到最近的15分钟整数倍,对于分析15分钟级别的聚合数据非常有用。
3、取昨日或当前日期函数
yesterday()、now()、today()
此类函数用于获取相对日期,如昨日、今日的日期,或当前的日期时间。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
yesterday() |
返回昨日 的日期,类型为 Date。 |
SELECT yesterday() AS yesterday_date; |
2026-03-14(假设当前日期为2026-03-15) |
now() |
返回当前 的日期与时间,类型为 DateTime。 |
SELECT now() AS current_datetime; |
2026-03-15 14:30:45(示例时间) |
today() |
返回今日 的日期,类型为 Date。 |
SELECT today() AS today_date; |
2026-03-15(示例日期) |
注意:
- 无参数函数:以上所有函数均不接收任何参数,其返回值基于服务器的当前系统时间。
- 返回值类型 :
now()返回DateTime,而today()和yesterday()返回Date,这在需要进行日期比较或时间计算时需特别注意。
二、类型转化类函数
1、精度截取函数(非四舍五入)
toDecimal32()、toDecimal64()、toDecimal128
该类函数用于对数值型或数值字符串进行精度转换,采用截断而非四舍五入的方式处理多余的小数位。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
toDecimal32(value, scale) |
将值(数值或字符串)转换为Decimal32类型,并指定小数位数scale。多余的小数位将被直接截断。 |
SELECT toDecimal32(123.456789, 2) AS result; SELECT toDecimal32('123.456789', 2) AS result; |
123.45 |
toDecimal64(value, scale) |
将值转换为Decimal64类型,并指定小数位数scale。拥有比Decimal32更高的整数位和小数位精度,处理方式为截断。 |
SELECT toDecimal64(123.456789, 2) AS result; SELECT toDecimal64('123.456789', 2) AS result; |
123.45 |
toDecimal128(value, scale) |
将值转换为Decimal128类型,并指定小数位数scale。拥有三种类型中最高的精度,处理方式为截断。 |
SELECT toDecimal128(123.456789, 2) AS result; SELECT toDecimal128('123.456789', 2) AS result; |
123.45 |
重要提示 :以上所有函数在执行转换时,如果原始值的小数部分超过指定的scale,多余的小数位将被直接舍弃,不进行任何舍入操作。
2、字符串型转为整型(非整数的字符串返回值为0)
toInt8()、toInt16()、toInt32()、toInt64()、
安全转换:toUInt8OrZero()、toInt8OrZero()、toFloat32OrZero()
此类函数是安全版本 的转换函数。它们在转换失败时返回 0或默认值,而不会抛出错误。函数名通常带有 OrZero后缀。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
toUInt8OrZero(string) |
将字符串转换为无符号8位整数(范围:0 到 255)。转换失败时返回 0。 |
SELECT toUInt8OrZero('255') AS result; SELECT toUInt8OrZero('abc') AS result; |
255 0 |
toInt8OrZero(string) |
将字符串转换为有符号8位整数(范围:-128 到 127)。转换失败时返回 0。 |
SELECT toInt8OrZero('-128') AS result; SELECT toInt8OrZero('abc') AS result; |
-128 0 |
toFloat32OrZero(string) |
将字符串转换为32位浮点数。转换失败时返回 0。 |
SELECT toFloat32OrZero('123.456') AS result; SELECT toFloat32OrZero('abc') AS result; |
123.456 0 |
注意:
- 转换失败的定义:当输入字符串无法被解析为对应类型(整数/浮点数)的有效数字表示时,即视为转换失败。
- 与标准转换函数的区别 :标准转换函数(如
toInt8)在遇到无法转换的字符串时会抛出异常,而OrZero系列函数则安全地返回0,适用于需要容错处理的场景。
3、将 字符串、整数(时间戳)或日期时间类型 转换为日期类型
toDate()、toDateTme()
此类函数用于将各种格式的输入转换为日期(Date)或日期时间(DateTime)类型。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
toDate(value) |
将字符串、整数(Unix时间戳)或DateTime转换为日期类型(仅包含年月日)。 | SELECT toDate('2026-03-15 14:30:45') AS date; SELECT toDate(1678886400) AS date; SELECT toDate(now()) AS date; |
2026-03-15 2023-03-16 2023-07-20(当前日期) |
toDateTime(value [, timezone]) |
将字符串、整数(Unix时间戳)或Date转换为日期时间类型(包含年月日时分秒)。可选的第二个参数指定时区。 | SELECT toDateTime('2026-03-15 14:30:45') AS datetime; SELECT toDateTime(1678886400) AS datetime; SELECT toDateTime('2026-03-15 14:30:45','Asia/Shanghai') AS datetime; |
2026-03-15 14:30:45 2023-03-16 00:00:00 2026-03-15 14:30:45(上海时区) |
注意:
- 时间戳处理:整数参数被解释为Unix时间戳(自1970-01-01 00:00:00 UTC以来的秒数)。
- 时区 :
toDateTime函数支持可选的时区参数。如果未指定,默认使用服务器时区。 - 格式要求 :字符串输入必须符合标准的日期或日期时间格式(如
'YYYY-MM-DD'或'YYYY-MM-DD HH:MM:SS'),否则转换将失败。
4、时间戳与日期相互转换函数
fromUnixTimestamp()、toDate()
关系如下:
Unix时间戳 (秒/毫秒) ⇄ DateTime/DateTime64 ⇄ Date
整数类型 日期时间类型 日期类型
此类函数用于Unix时间戳(秒级)与Date/DateTime类型之间的转换
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
fromUnixTimestamp(unix_timestamp [, timezone]) |
将秒级Unix时间戳转换为DateTime类型。可选的第二个参数用于指定输出时间的时区。 | SELECT fromUnixTimestamp(1700000000) AS dt; |
2023-11-14 22:13:20(默认UTC时区) |
| 指定目标时区进行转换。 | SELECT fromUnixTimestamp(1700000000, 'Asia/Shanghai') AS dt_beijing; |
2023-11-15 06:13:20(北京时间,UTC+8) |
|
toDate(value) |
从秒级Unix时间戳直接获取Date(仅日期部分)。 | SELECT toDate(1700000000) AS date_only; |
2023-11-14 |
组合fromUnixTimestamp使用,先转为DateTime再提取Date。 |
SELECT toDate(fromUnixTimestamp(1700000000)) AS same; |
2023-11-14 |
|
| 从DateTime类型中提取Date。 | SELECT toDate(toDateTime(1700000000)) AS date_from_dt; |
2023-11-14 |
注意:
- 时区影响 :
fromUnixTimestamp的转换结果依赖于时区。不指定时区时,默认使用UTC;指定时区后,结果会相应调整。 toDate的多功能性 :toDate函数可以直接接收时间戳,也可以接收DateTime类型作为输入,均能正确提取出日期部分,使用上非常灵活。
5、其他
cast()、toString()、toTypeName()
此类函数用于在数据类型之间进行转换,或将值转换为字符串,以及查询值的数据类型。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
cast(value, type) |
将值转换为指定的数据类型。这是通用的类型转换函数。 | SELECT cast('123', 'Int32') AS int_val; SELECT cast(123.456, 'String') AS str_val; SELECT cast('2026-03-15', 'Date') AS date_val; |
123 '123.456' 2026-03-15 |
使用::运算符进行类型转换(CAST的语法糖)。 |
SELECT '123'::Int32 AS int_val; SELECT 123.456::String AS str_val; |
123 '123.456' |
|
toString(value) |
将任意类型的值转换为字符串表示。 | SELECT toString(123) AS str; SELECT toString(12.34) AS str; SELECT toString(today()) AS str; |
'123' '12.34' '2026-03-15' |
toTypeName(value) |
返回传入值的数据类型名称。 | SELECT toTypeName(123) AS type; SELECT toTypeName(12.34) AS type; SELECT toTypeName('hello') AS type; SELECT toTypeName(today()) AS type; |
'Int32' 'Float64' 'String' 'Date' |
注意:
- 类型转换的安全性 :
cast函数在转换失败时会抛出异常。对于可能转换失败的情况,建议使用带有OrZero、OrNull或OrDefault后缀的安全转换函数(如之前提到的toInt32OrZero等)。 - ::运算符运算符:这是CAST函数的简写形式,功能完全相同,但书写更简洁。
- toString`的用途:常用于将数值、日期等类型转换为字符串以便进行字符串拼接、格式化输出等操作。
toTypeName的调试价值:在编写复杂查询或处理不确定类型的列时,此函数非常有用,可帮助确认数据的实际类型。
三、字符串函数
1、字符串处理
length()、lower()、upper()、subString()、concat()
empty()、notEmpty()、reverse()、appendTrailingCharIfAbsent()
此类函数用于处理字符串,包括获取长度、转换大小写、截取子串、拼接、判断空值、反转和追加字符等操作。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
length(s) |
返回字符串的字节长度(对于UTF-8编码,一个汉字占3个字节)。 | SELECT length('Hello') AS len; SELECT length('你好') AS len; |
5 6 |
lower(s) |
将字符串转换为小写。 | SELECT lower('Hello WORLD') AS lower_str; |
'hello world' |
upper(s) |
将字符串转换为大写。 | SELECT upper('Hello world') AS upper_str; |
'HELLO WORLD' |
substring(s, offset, length) (或 substr) |
从字符串 s的 offset位置开始截取指定 length长度的子串。位置从1开始计数。 |
SELECT substring('Hello World', 7, 5) AS substr; SELECT substring('你好世界', 4, 3) AS substr; |
'World' '世'(UTF-8中一个汉字占3个字节) |
concat(s1, s2, ...) |
将多个字符串按顺序拼接成一个字符串。 | SELECT concat('Hello', ' ', 'World') AS concat_str; SELECT concat('2026', '-', '03', '-', '15') AS date_str; |
'Hello World' '2026-03-15' |
empty(s) |
判断字符串是否为空。如果字符串为空(长度为0),则返回1,否则返回0。 | SELECT empty('') AS is_empty; SELECT empty('Hello') AS is_empty; |
1 0 |
notEmpty(s) |
判断字符串是否非空。如果字符串长度大于0,则返回1,否则返回0。 | SELECT notEmpty('') AS not_empty; SELECT notEmpty('Hello') AS not_empty; |
0 1 |
reverse(s) |
将字符串反转。 | SELECT reverse('abc') AS rev; SELECT reverse('你好') AS rev; |
'cba' '好你' |
appendTrailingCharIfAbsent(s, char) |
如果字符串 s的末尾没有以字符 char结尾,则在末尾追加该字符。 |
SELECT appendTrailingCharIfAbsent('hello', '!') AS str1; SELECT appendTrailingCharIfAbsent('hello!', '!') AS str2; |
'hello!' 'hello!'(已以'!'结尾,保持不变) |
注意:
- 字符串长度 :
length函数返回的是字节数,而非字符数。对于多字节字符(如中文),需要使用lengthUTF8函数来获取字符数。 - 子串截取 *:
substring函数的偏移量(offset)从1开始。如果使用字节偏移,对于多字节字符需谨慎;可使用substringUTF8函数按字符数截取。 - 空字符串判断 *:
empty和notEmpty函数对于只包含空白字符的字符串会返回非空(因为长度大于0),必要时可结合trim函数使用。 - 字符追加 *:
appendTrailingCharIfAbsent常用于确保字符串以特定字符(如路径分隔符)结尾,避免重复追加。
2、字符串查找、替换、切割、拼接、重复与空格填充
字符串查找:
match()、extractAll()、like()、notLike()
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
match(haystack, pattern) |
检查字符串 haystack是否与正则表达式 pattern匹配。匹配返回1,否则返回0。 |
SELECT match('Hello World', '^Hello.*') AS matched; SELECT match('Hello World', '^World.*') AS matched; |
1 0 |
extractAll(haystack, pattern) |
从字符串 haystack中提取所有匹配正则表达式 pattern的子串,返回一个数组。 |
SELECT extractAll('a1 b2 c3', '[a-c]') AS extracts; SELECT extractAll('123-456-789', '\d+') AS extracts; |
['a','b','c'] ['123','456','789'] |
like(haystack, pattern) |
检查字符串 haystack是否匹配简单的SQL LIKE模式(支持 %和 _通配符)。匹配返回1,否则返回0。 |
SELECT like('Hello World', 'Hello%') AS is_like; SELECT like('Hello World', '%World') AS is_like; SELECT like('Hello World', 'Hello_World') AS is_like; |
1 1 0 |
notLike(haystack, pattern) |
检查字符串 haystack是否不匹配简单的SQL LIKE模式。不匹配返回1,否则返回0。 |
SELECT notLike('Hello World', 'Hello%') AS not_like; SELECT notLike('Hello World', '%Test%') AS not_like; |
0 1 |
字符串替换:
repalceOne()、repalceAll()、repalceRegexpOne()、repalceRegexpAll()
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
replaceOne(haystack, pattern, replacement) |
将字符串 haystack中第一个 匹配的子串 pattern替换为 replacement。 |
SELECT replaceOne('Hello World World', 'World', 'Test') AS replaced; SELECT replaceOne('aaa', 'a', 'b') AS replaced; |
'Hello Test World' 'baa' |
replaceAll(haystack, pattern, replacement) |
将字符串 haystack中所有 匹配的子串 pattern替换为 replacement。 |
SELECT replaceAll('Hello World World', 'World', 'Test') AS replaced; SELECT replaceAll('aaa', 'a', 'b') AS replaced; |
'Hello Test Test' 'bbb' |
replaceRegexpOne(haystack, pattern, replacement) |
使用正则表达式 pattern进行匹配,替换字符串 haystack中第一个匹配项。 |
SELECT replaceRegexpOne('Hello 123 World 456', '\d+', '#') AS replaced; SELECT replaceRegexpOne('a1 b2 c3', '[a-z]', '*') AS replaced; |
'Hello # World 456' '*1 b2 c3' |
replaceRegexpAll(haystack, pattern, replacement) |
使用正则表达式 pattern进行匹配,替换字符串 haystack中所有匹配项。 |
SELECT replaceRegexpAll('Hello 123 World 456', '\d+', '#') AS replaced; SELECT replaceRegexpAll('a1 b2 c3', '[a-z]', '*') AS replaced; |
'Hello # World #' '*1 *2 *3' |
字符串切割:
splitByChar()、splitByString()
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
splitByChar(separator, haystack) |
使用单个字符 separator作为分隔符,将字符串 haystack分割成子串数组。 |
SELECT splitByChar(',', 'a,b,c') AS parts; |
['a','b','c'] |
splitByString(separator, haystack) |
使用字符串 separator作为分隔符,将字符串 haystack分割成子串数组。 |
SELECT splitByString('--', 'x--y--z') AS parts; |
['x','y','z'] |
注意:
- 正则表达式 :
match、extractAll、replaceRegexpOne和replaceRegexpAll使用正则表达式,语法遵循Re2库。 - LIKE模式 :
like和notLike使用SQL标准的LIKE模式,其中%匹配任意数量字符,_匹配单个字符。 - 替换函数 :
replaceOne和replaceAll进行简单字符串替换,而replaceRegexpOne和replaceRegexpAll使用正则表达式进行模式匹配替换。 - 分割函数 :
splitByChar要求分隔符为单个字符,而splitByString的分隔符可以是任意字符串。
字符串拼接函数
此类函数用于将多个字符串或值连接成单个字符串。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
concat(s1, s2, ...) |
将多个字符串按顺序连接成一个字符串。 | SELECT concat('Hello', ' ', 'World') AS str; SELECT concat('2026', '-', '03', '-', '15') AS date_str; SELECT concat(42, ' is the answer') AS mixed; |
'Hello World' '2026-03-15' '42 is the answer'(数字被隐式转换为字符串) |
concatAssumeInjective(s1, s2, ...) |
功能同concat,但向查询优化器声明此连接是"单射的"(即不同输入始终产生不同输出),可用于查询优化。 |
SELECT concatAssumeInjective('user', '_', 123) AS user_id; SELECT concatAssumeInjective('path/', filename) AS full_path; |
'user_123' 'path/document.txt'(假设filename='document.txt') |
concatWithSeparator(separator, s1, s2, ...) |
用指定的分隔符连接多个字符串。 | SELECT concatWithSeparator(', ', 'apple', 'banana', 'cherry') AS fruits; SELECT concatWithSeparator('-', '2026', '03', '15') AS date_str; |
'apple, banana, cherry' '2026-03-15' |
format(pattern, s1, s2, ...) |
按照C风格的格式化字符串(%s、%d等)将参数格式化。 |
SELECT format('Hello %s!', 'World') AS greeting; SELECT format('%s is %d years old', 'Alice', 30) AS info; SELECT format('%04d-%02d-%02d', 2026, 3, 15) AS date_str; |
'Hello World!' 'Alice is 30 years old' '2026-03-15' |
字符串拼接运算符
除了函数,ClickHouse还支持||运算符进行字符串连接。
| 运算符/用法 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
| **`s1 | s2 |
字符串重复与空格填充
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
repeat(s, n) |
将字符串s重复n次。 |
SELECT repeat('ab', 3) AS repeated; SELECT repeat('-', 10) AS line; |
'ababab' '----------' |
space(n) |
返回由n个空格组成的字符串。 |
`SELECT 'Hello' |
四、条件判断函数
此类函数用于根据条件执行不同的操作,实现类似编程语言中的 if-else 逻辑。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
if(condition, then, else) |
如果条件为真(非零),返回then的值,否则返回else的值。 |
SELECT if(1 > 0, 'true', 'false') AS result; SELECT if(length('abc') > 5, 'long', 'short') AS result; SELECT if(0, 'yes', 'no') AS result; |
'true' 'short' 'no' |
multiIf(cond1, res1, cond2, res2, ..., else_res) |
多条件分支判断,按顺序检查条件,返回第一个为真条件对应的结果,如果没有条件为真则返回else_res。 |
SELECT multiIf(score >= 90, 'A', score >= 80, 'B', score >= 60, 'C', 'D') AS grade FROM (SELECT 85 AS score); SELECT multiIf(1=2, 'a', 3>2, 'b', 'c') AS result; |
'B' 'b' |
CASE 表达式 CASE WHEN cond1 THEN res1 WHEN cond2 THEN res2 ... ELSE else_res END |
标准SQL的CASE WHEN表达式,功能同multiIf,但语法更SQL标准。 |
SELECT CASE WHEN 1=0 THEN 'a' WHEN 1=1 THEN 'b' ELSE 'c' END AS result; SELECT CASE WHEN 2>3 THEN 'big' WHEN 2>1 THEN 'small' ELSE 'equal' END AS result; |
'b' 'small' |
isNull(x) |
检查参数是否为NULL。如果是NULL则返回1,否则返回0。 | SELECT isNull(NULL) AS isnull1; SELECT isNull('not null') AS isnull2; |
1 0 |
isNotNull(x) |
检查参数是否不为NULL。如果不是NULL则返回1,否则返回0。 | SELECT isNotNull(NULL) AS notnull1; SELECT isNotNull('not null') AS notnull2; |
0 1 |
ifNull(x, y) |
如果x不为NULL,则返回x,否则返回y。 |
SELECT ifNull(NULL, 'default') AS val1; SELECT ifNull('not null', 'default') AS val2; |
'default' 'not null' |
nullIf(x, y) |
如果x等于y,则返回NULL,否则返回x。 |
SELECT nullIf(5, 5) AS val1; SELECT nullIf(5, 3) AS val2; |
NULL 5 |
coalesce(x1, x2, ..., xn) |
返回参数列表中第一个非NULL的值。如果所有参数都为NULL,则返回NULL。 | SELECT coalesce(NULL, NULL, 'first not null', 'ignored') AS val; SELECT coalesce(NULL, NULL, NULL) AS val; |
'first not null' NULL |
注意:
- 条件判断:条件表达式应为布尔类型(0表示假,非0表示真)。
- 类型一致性 :
if和multiIf函数中的then/else参数应有相同或兼容的数据类型。 - NULL处理 :
isNull、isNotNull、ifNull、nullIf、coalesce是专门处理NULL值的函数,在数据清洗和转换中非常有用。 - CASE表达式 :是SQL标准语法,可读性更好,尤其适用于多个条件分支的情况。
multiIf是ClickHouse的特定函数,功能相同但语法更简洁。 - 性能 :
multiIf在处理大量分支时可能比嵌套的if函数更高效。
五、数学函数
此类函数用于执行基本的数学运算,包括取整、绝对值、幂运算、对数、三角函数等。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
abs(x) |
返回x的绝对值。 |
SELECT abs(-5) AS val; SELECT abs(3.14) AS val; |
5 3.14 |
ceil(x) (或ceiling) |
返回大于或等于x的最小整数(向上取整)。 |
SELECT ceil(3.14) AS val; SELECT ceil(-3.14) AS val; |
4 -3 |
floor(x) |
返回小于或等于x的最大整数(向下取整)。 |
SELECT floor(3.14) AS val; SELECT floor(-3.14) AS val; |
3 -4 |
round(x , n) |
将x四舍五入到指定的小数位数n。如果省略n,则四舍五入到整数。 |
SELECT round(3.14159, 2) AS val; SELECT round(3.14159) AS val; SELECT round(3.5) AS val; |
3.14 3 4 |
truncate(x , n) (或trunc) |
将x截断到指定的小数位数n(不四舍五入)。如果省略n,则截断为整数。 |
SELECT truncate(3.14159, 2) AS val; SELECT truncate(3.14159) AS val; SELECT truncate(3.999) AS val; |
3.14 3 3 |
pow(x, y) (或power) |
返回x的y次幂。 |
SELECT pow(2, 3) AS val; SELECT pow(9, 0.5) AS val; |
8 3 |
sqrt(x) |
返回x的平方根。 |
SELECT sqrt(9) AS val; SELECT sqrt(2) AS val; |
3 1.4142135623730951 |
exp(x) |
返回e(自然对数的底)的x次幂。 |
SELECT exp(1) AS val; SELECT exp(0) AS val; |
2.718281828459045 1 |
ln(x) (或log) |
返回x的自然对数(以e为底)。 |
SELECT ln(1) AS val; SELECT ln(exp(2)) AS val; |
0 2 |
log10(x) |
返回x的以10为底的对数。 |
SELECT log10(100) AS val; SELECT log10(1000) AS val; |
2 3 |
log2(x) |
返回x的以2为底的对数。 |
SELECT log2(8) AS val; SELECT log2(1) AS val; |
3 0 |
sin(x) |
返回x的正弦值,x为弧度。 |
SELECT sin(0) AS val; SELECT sin(pi()/2) AS val; |
0 1 |
cos(x) |
返回x的余弦值,x为弧度。 |
SELECT cos(0) AS val; SELECT cos(pi()) AS val; |
1 -1 |
tan(x) |
返回x的正切值,x为弧度。 |
SELECT tan(0) AS val; SELECT tan(pi()/4) AS val; |
0 1 |
asin(x) |
返回x的反正弦值,结果在[-π/2, π/2]弧度之间。 |
SELECT asin(0) AS val; SELECT asin(1) AS val; |
0 1.5707963267948966 |
acos(x) |
返回x的反余弦值,结果在[0, π]弧度之间。 |
SELECT acos(1) AS val; SELECT acos(0) AS val; |
0 1.5707963267948966 |
atan(x) |
返回x的反正切值,结果在[-π/2, π/2]弧度之间。 |
SELECT atan(0) AS val; SELECT atan(1) AS val; |
0 0.7853981633974483 |
pi() |
返回圆周率π的近似值。 | SELECT pi() AS pi_val; |
3.141592653589793 |
mod(x, y) |
返回x除以y的余数。 |
SELECT mod(10, 3) AS val; SELECT mod(10.5, 3) AS val; |
1 1.5 |
rand() |
返回一个在[0, 1)范围内的均匀分布随机浮点数。 | SELECT rand() AS random_val; SELECT rand() AS another_random; |
随机值,如0.123456 另一个随机值 |
randConstant() |
返回一个在[0, 1)范围内的随机浮点数,但在单个查询中该值是常量。 | SELECT randConstant() AS const_random; (同一查询中多次调用返回相同值) |
随机但固定的值,如0.789 |
注意:
- 参数单位 :三角函数(
sin、cos、tan等)的参数为弧度,而非角度。可使用pi()函数进行转换,例如sin(radians(30)),但ClickHouse本身不提供radians函数,需手动计算(弧度 = 角度 * π / 180)。 - 取整差异 :
ceil始终向上取整,floor始终向下取整,round为四舍五入,truncate为直接截断。 - 随机数生成 :
rand()每次调用都可能返回不同的值,而randConstant()在同一个查询中返回相同的值,但在不同查询中会变化。 - 数学常数 :
pi()函数返回圆周率π,常用于三角函数计算。
六、URL操作函数
此类函数用于解析、提取和处理URL字符串的各个组成部分。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
protocol(url) |
提取URL的协议部分(如http、https、ftp等)。 | SELECT protocol('https://www.example.com/path') AS prot; SELECT protocol('ftp://server.com/file.txt') AS prot; |
'https' 'ftp' |
domain(url) |
提取URL的域名(包含端口)。 | SELECT domain('https://www.example.com:8080/path') AS dom; SELECT domain('https://sub.example.com/path') AS dom; |
'www.example.com:8080' 'sub.example.com' |
domainWithoutWWW(url) |
提取URL的域名,并去除开头的"http://www."。 | SELECT domainWithoutWWW('https://www.example.com/path') AS dom; SELECT domainWithoutWWW('https://example.com/path') AS dom; |
'example.com' 'example.com' |
topLevelDomain(url) |
提取URL的顶级域名(TLD)。 | SELECT topLevelDomain('https://www.example.com/path') AS tld; SELECT topLevelDomain('https://www.example.co.uk/path') AS tld; |
'com' 'co.uk' |
firstSignificantSubdomain(url) |
提取URL的第一个有效子域名。通常返回二级域名(对于.com等gTLD)或三级域名(对于.co.uk等ccTLD)。 | SELECT firstSignificantSubdomain('https://www.example.com/path') AS sub; SELECT firstSignificantSubdomain('https://news.bbc.co.uk/path') AS sub; |
'example' 'bbc' |
cutToFirstSignificantSubdomain(url) |
截取到第一个有效子域名的部分。 | SELECT cutToFirstSignificantSubdomain('https://www.example.com/path') AS cut; SELECT cutToFirstSignificantSubdomain('https://news.bbc.co.uk/path') AS cut; |
'example.com' 'bbc.co.uk' |
path(url) |
提取URL的路径部分(不包含查询参数和片段标识)。 | SELECT path('https://example.com/path/to/file?q=1#section') AS p; SELECT path('https://example.com/') AS p; |
'/path/to/file' '/' |
pathFull(url) |
提取URL的完整路径(包括查询参数和片段标识)。 | SELECT pathFull('https://example.com/path?q=1#section') AS full; SELECT pathFull('https://example.com/') AS full; |
'/path?q=1#section' '/' |
queryString(url) |
提取URL的查询字符串(问号之后的部分,不包含片段标识)。 | SELECT queryString('https://example.com/path?q=1&t=2#section') AS qs; SELECT queryString('https://example.com/path') AS qs; |
'q=1&t=2' '' |
fragment(url) |
提取URL的片段标识(#之后的部分)。 | SELECT fragment('https://example.com/path#section1') AS frag; SELECT fragment('https://example.com/path') AS frag; |
'section1' '' |
queryParameter(url, param) |
提取指定查询参数的值。 | SELECT queryParameter('https://example.com/?q=1&t=2', 'q') AS val; SELECT queryParameter('https://example.com/?q=1&t=2', 't') AS val; SELECT queryParameter('https://example.com/?q=1&t=2', 'nonexistent') AS val; |
'1' '2' '' |
decodeURLComponent(url_encoded_string) |
对URL编码的字符串进行解码。 | SELECT decodeURLComponent('hello%20world%21') AS decoded; SELECT decodeURLComponent('%E4%BD%A0%E5%A5%BD') AS decoded; |
'hello world!' '你好' |
encodeURLComponent(string) |
对字符串进行URL编码(包括所有特殊字符)。 | SELECT encodeURLComponent('hello world!') AS encoded; SELECT encodeURLComponent('你好') AS encoded; |
'hello%20world%21' '%E4%BD%A0%E5%A5%BD' |
encodeURL(string) |
对字符串进行URL编码,但保留部分特殊字符不编码(如/、?、#、=、&等)。 |
SELECT encodeURL('path/to/file?q=1&t=2') AS encoded; SELECT encodeURL('你好 世界') AS encoded; |
'path/to/file?q=1&t=2' '%E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C' |
cutWWW(url) |
去除URL中的"http://www."前缀。 | SELECT cutWWW('www.example.com') AS cut; SELECT cutWWW('example.com') AS cut; |
'example.com' 'example.com' |
cutQueryString(url) |
去除URL中的查询字符串部分。 | SELECT cutQueryString('https://example.com/path?q=1#section') AS cut; SELECT cutQueryString('https://example.com/path#section') AS cut; |
'https://example.com/path#section' 'https://example.com/path#section' |
cutFragment(url) |
去除URL中的片段标识部分。 | SELECT cutFragment('https://example.com/path?q=1#section') AS cut; SELECT cutFragment('https://example.com/path?q=1') AS cut; |
'https://example.com/path?q=1' 'https://example.com/path?q=1' |
extractURLParameterNames(url) |
提取URL中所有查询参数的名称,返回数组。 | SELECT extractURLParameterNames('https://example.com/?q=1&t=2&s=3') AS params; SELECT extractURLParameterNames('https://example.com/') AS params; |
['q','t','s'] [] |
extractURLParameters(url) |
提取URL中所有查询参数,返回Map(String, String)类型。 |
SELECT extractURLParameters('https://example.com/?q=1&t=2&t=3') AS params; SELECT extractURLParameters('https://example.com/') AS params; |
{'q':'1','t':'3'}(注意:相同参数名取最后一个值) {} |
注意:
- 子域名处理 :
firstSignificantSubdomain和cutToFirstSignificantSubdomain函数会考虑公共后缀列表,正确处理.co.uk、.com.cn等特殊域名的逻辑。 - 编码/解码 :
encodeURLComponent会编码所有非字母数字字符,而encodeURL会保留一些URL特殊字符不编码,通常用于编码整个URL的各个部分。 - 查询参数 :
queryParameter只返回第一个匹配参数的值。如果有多个同名参数,可以使用extractURLParameters获取所有值(以Map形式)。 - 中文编码:URL编码/解码函数能正确处理UTF-8字符,如中文字符。
七、JSON操作函数
此类函数用于解析、提取和操作JSON格式的数据。
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
JSONExtract(json, type) |
从JSON字符串中提取值并转换为指定类型。type可以是String、Int、Float、Bool、Array、Object等。 |
SELECT JSONExtract('{"name": "Alice", "age": 30}', 'String', 'name') AS name; SELECT JSONExtract('{"age": 30}', 'Int', 'age') AS age; |
'Alice' 30 |
JSONExtractString(json, path, ...) |
从JSON中提取字符串值。支持通过路径(用点号或方括号)访问嵌套字段。 | SELECT JSONExtractString('{"user": {"name": "Alice"}}', 'user', 'name') AS name; SELECT JSONExtractString('{"list": ["a", "b"]}', 'list', 1) AS item;(索引从1开始) |
'Alice' 'a' |
JSONExtractInt(json, path, ...) |
从JSON中提取整数值。 | SELECT JSONExtractInt('{"data": {"count": 100}}', 'data', 'count') AS count; SELECT JSONExtractInt('{"value": 42}', 'value') AS val; |
100 42 |
JSONExtractFloat(json, path, ...) |
从JSON中提取浮点数值。 | SELECT JSONExtractFloat('{"price": 19.99}', 'price') AS price; SELECT JSONExtractFloat('{"stats": {"avg": 3.14}}', 'stats', 'avg') AS avg; |
19.99 3.14 |
JSONExtractBool(json, path, ...) |
从JSON中提取布尔值。 | SELECT JSONExtractBool('{"active": true}', 'active') AS active; SELECT JSONExtractBool('{"settings": {"enabled": false}}', 'settings', 'enabled') AS enabled; |
1(true) 0(false) |
JSONExtractArrayRaw(json, [path, ...]) |
从JSON中提取数组,返回原始的JSON字符串数组。 | SELECT JSONExtractArrayRaw('{"items": ["a", "b", "c"]}', 'items') AS items; SELECT JSONExtractArrayRaw('{"data": [1, 2, 3]}', 'data') AS data; |
'["a","b","c"]' '[1,2,3]' |
JSONExtractKeys(json, [path, ...]) |
从JSON对象中提取所有键名,返回数组。 | SELECT JSONExtractKeys('{"name": "A", "age": 20}') AS keys; SELECT JSONExtractKeys('{"user": {"name": "A", "age": 20}}', 'user') AS keys; |
['name','age'] ['name','age'] |
JSONExtractValues(json, [path, ...]) |
从JSON对象中提取所有值,返回JSON字符串数组。 | SELECT JSONExtractValues('{"a": 1, "b": "hello"}') AS values; SELECT JSONExtractValues('{"x": {"a": 1, "b": 2}}', 'x') AS values; |
['1','"hello"'] ['1','2'] |
JSONExtractRaw(json, [path, ...]) |
从JSON中提取任意类型的值,返回原始的JSON字符串表示。 | SELECT JSONExtractRaw('{"data": {"nested": 123}}', 'data') AS raw; SELECT JSONExtractRaw('{"list": [1,2,3]}', 'list', 1) AS item; |
'{"nested":123}' '1' |
JSONHas(json, [path, ...]) |
检查JSON中是否存在指定的键或路径。存在返回1,否则返回0。 | SELECT JSONHas('{"a": 1}', 'a') AS has; SELECT JSONHas('{"a": {"b": 2}}', 'a', 'b') AS has; SELECT JSONHas('{"a": 1}', 'b') AS has; |
1 1 0 |
JSONLength(json, [path, ...]) |
返回JSON数组的长度或JSON对象的键值对数量。 | SELECT JSONLength('{"a": 1, "b": 2}') AS len; SELECT JSONLength('{"items": ["a", "b", "c"]}', 'items') AS len; SELECT JSONLength('[]') AS len; |
2 3 0 |
JSONType(json, [path, ...]) |
返回JSON值的类型名称,如Object、Array、String、Int、Bool、Null等。 |
SELECT JSONType('{"a": 1}') AS type; SELECT JSONType('["a", "b"]') AS type; SELECT JSONType('123') AS type; SELECT JSONType('null') AS type; |
'Object' 'Array' 'Int' 'Null' |
JSONExtractKeysAndValues(json, [path, ...]) |
从JSON对象中提取所有键值对,返回Map(String, String)类型。 |
SELECT JSONExtractKeysAndValues('{"a": 1, "b": "hello"}') AS map; SELECT JSONExtractKeysAndValues('{"x": {"a": 1, "b": 2}}', 'x') AS map; |
{'a':'1','b':'"hello"'} {'a':'1','b':'2'} |
JSONExtractArray(json, type, [path, ...]) |
从JSON中提取数组,并将每个元素转换为指定的类型。 | SELECT JSONExtractArray('[1, 2, 3]', 'Int') AS arr; SELECT JSONExtractArray('["a", "b", "c"]', 'String') AS arr; |
[1,2,3] ['a','b','c'] |
visitParamExtractInt(json, param_name) |
从简单的JSON字符串中提取整数参数(仅适用于简单的key:value格式)。 | SELECT visitParamExtractInt('{"id": 100}', 'id') AS id; SELECT visitParamExtractInt('{"score": 95.5}', 'score') AS score;(浮点数截断) |
100 95 |
visitParamExtractString(json, param_name) |
从简单的JSON字符串中提取字符串参数(仅适用于简单的key:value格式)。 | SELECT visitParamExtractString('{"name": "Alice"}', 'name') AS name; SELECT visitParamExtractString('{"data": "value"}', 'data') AS data; |
'Alice' 'value' |
JSONExtractUInt JSONExtractInt8 JSONExtractInt16 JSONExtractInt32 JSONExtractInt64 JSONExtractUInt8 JSONExtractUInt16 JSONExtractUInt32 JSONExtractUInt64 JSONExtractFloat32 JSONExtractFloat64 |
从JSON中提取指定精度的数值。功能同JSONExtractInt/Float,但可以明确指定整数位数和符号。 |
SELECT JSONExtractUInt64('{"big": 1234567890123}', 'big') AS big; SELECT JSONExtractFloat64('{"pi": 3.14159265358979}', 'pi') AS pi; |
1234567890123 3.14159265358979 |
注意:
- 路径语法 :路径可以是字符串键(用点号
.连接)或数组索引(从1开始)。例如'a.b'、'a'、1、'list'、0等。 - 性能 :
visitParamExtract*函数比JSONExtract*函数性能更高,但仅适用于简单的、非嵌套的JSON字符串。 - 类型转换:如果JSON中的值与目标类型不兼容,函数会尝试转换,如果无法转换则返回默认值(0、空字符串、false等)。
- 嵌套访问 :
JSONExtract*系列函数支持通过多个参数指定嵌套路径,如JSONExtractString(json, 'user', 'profile', 'name')。 - 数组索引:在ClickHouse JSON函数中,数组索引通常从1开始,而不是从0开始。
八、IP地址操作函数
此类函数用于处理IPv4和IPv6地址,包括地址验证、类型转换、子网计算和属性提取
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
toIPv4(str) |
将字符串转换为IPv4类型的值。这是最常用的IPv4创建函数。 | SELECT toIPv4('192.168.0.1') AS ipv4; SELECT toIPv4('1.1.1.1') AS ipv4; |
'192.168.0.1' '1.1.1.1' |
toIPv6(str) |
将字符串转换为IPv6类型的值。这是最常用的IPv6创建函数。 | SELECT toIPv6('2a02:6b8::11') AS ipv6; SELECT toIPv6('::ffff:192.168.0.1') AS ipv6; |
'2a02:6b8::11' '::ffff:192.168.0.1' |
isIPv4String(str) |
检查字符串是否为有效的IPv4地址。常用于数据验证。 | SELECT isIPv4String('192.168.0.1') AS valid; SELECT isIPv4String('256.256.256.256') AS valid; |
1 0 |
isIPv6String(str) |
检查字符串是否为有效的IPv6地址。常用于数据验证。 | SELECT isIPv6String('2a02:6b8::11') AS valid; SELECT isIPv6String('invalid') AS valid; |
1 0 |
isIPAddressInRange(ip, cidr) |
检查IP地址是否在指定的CIDR子网范围内。这是IP过滤和分组的核心函数。 | SELECT isIPAddressInRange('192.168.1.5', '192.168.1.0/24') AS in_range; SELECT isIPAddressInRange('10.0.0.1', '192.168.1.0/24') AS in_range; |
1 0 |
IPv4NumToString(num) |
将32位整数表示的IPv4地址转换为字符串格式。用于处理存储为整数的IP地址。 | SELECT IPv4NumToString(3232235521) AS ip_str; SELECT IPv4NumToString(16843009) AS ip_str; |
'192.168.0.1' '1.1.1.1' |
IPv4StringToNum(str) |
将IPv4地址字符串转换为32位整数表示。用于将IP地址转换为整数存储。 | SELECT IPv4StringToNum('192.168.0.1') AS ip_num; SELECT IPv4StringToNum('1.1.1.1') AS ip_num; |
3232235521 16843009 |
toIPv4OrDefault(str) |
将字符串转换为IPv4类型的值,如果转换失败则返回默认值(0.0.0.0)。这是安全的转换函数。 | SELECT toIPv4OrDefault('192.168.0.1') AS ip; SELECT toIPv4OrDefault('invalid') AS ip; |
'192.168.0.1' '0.0.0.0' |
toIPv6OrDefault(str) |
将字符串转换为IPv6类型的值,如果转换失败则返回默认值(::)。这是安全的转换函数。 | SELECT toIPv6OrDefault('2a02:6b8::1') AS ip; SELECT toIPv6OrDefault('invalid') AS ip; |
'2a02:6b8::1' '::' |
精选说明:
- 基础转换 :
toIPv4和toIPv6是最常用的IP地址创建函数,推荐优先使用。 - 验证函数 :
isIPv4String和isIPv6String用于数据清洗和验证,确保IP地址格式正确。 - 核心功能 :
isIPAddressInRange是IP分析的核心,用于IP归属判断、网络过滤等场景。 - 格式转换 :
IPv4NumToString和IPv4StringToNum用于处理存储为整数的IP地址(常见于日志系统)。 - 安全转换 :
toIPv4OrDefault和toIPv6OrDefault提供安全的转换方式,避免因无效IP地址导致的查询错误。
这9个函数覆盖了IP地址处理的绝大部分常见需求,包括创建、验证、格式转换、范围判断和安全处理。
九、加密与哈希函数
| 函数 | 功能描述 | 示例 | 结果 |
|---|---|---|---|
MD5(string) |
计算字符串的MD5哈希值(128位/16字节),返回32个十六进制字符。 | SELECT MD5('hello') AS md5_hash; SELECT MD5('') AS md5_empty; |
'5d41402abc4b2a76b9719d911017c592' 'd41d8cd98f00b204e9800998ecf8427e' |
SHA1(string) |
计算字符串的SHA1哈希值(160位/20字节),返回40个十六进制字符。 | SELECT SHA1('hello') AS sha1_hash; SELECT SHA1('') AS sha1_empty; |
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d' 'da39a3ee5e6b4b0d3255bfef95601890afd80709' |
SHA256(string) |
计算字符串的SHA256哈希值(256位/32字节),返回64个十六进制字符。 | SELECT SHA256('hello') AS sha256_hash; SELECT SHA256('') AS sha256_empty; |
'2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824' 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' |
SHA512(string) |
计算字符串的SHA512哈希值(512位/64字节),返回128个十六进制字符。 | SELECT SHA512('hello') AS sha512_hash; SELECT SHA512('') AS sha512_empty; |
'9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043' 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e' |
base64Encode(string) |
将字符串进行Base64编码。 | SELECT base64Encode('hello world') AS encoded; SELECT base64Encode('你好') AS encoded; |
'aGVsbG8gd29ybGQ=' '5L2g5aW9' |
base64Decode(string) |
将Base64编码的字符串解码。 | SELECT base64Decode('aGVsbG8gd29ybGQ=') AS decoded; SELECT base64Decode('5L2g5aW9') AS decoded; |
'hello world' '你好' |
hex(string) |
将字符串编码为十六进制表示。 | SELECT hex('hello') AS hex_str; SELECT hex(123) AS hex_num; |
'68656C6C6F' '7B'(123的十六进制) |
unhex(string) |
将十六进制字符串解码为原始字符串。 | SELECT unhex('68656C6C6F') AS original; SELECT unhex('7B') AS original_num; |
'hello' '{'(ASCII 123是'{') |
cityHash64(string) |
计算字符串的CityHash64值(64位哈希),返回UInt64整数。这是ClickHouse自带的快速非加密哈希函数。 | SELECT cityHash64('hello') AS cityhash; SELECT cityHash64('world') AS cityhash; |
'2794345569481354649' '18230407130658417560' |
精选说明:
- 安全哈希 :
MD5、SHA1、SHA256、SHA512是标准的密码学哈希函数,用于数据完整性验证、数字签名等。其中SHA256是目前最常用的安全哈希算法。 - 数据编码 :
base64Encode和base64Decode用于二进制数据的文本化传输,如图片、文件等。 - 十六进制转换 :
hex和unhex用于二进制数据与可读十六进制表示之间的转换,常用于调试和日志记录。 - 快速哈希 :
cityHash64是ClickHouse自带的非加密哈希函数,速度极快,适用于数据分片、去重、一致性哈希等场景,但不适用于安全加密用途。
注意事项:
- MD5和SHA1已不再被视为安全的加密哈希函数(存在碰撞攻击风险),但仍广泛用于数据完整性检查和校验和。
- 对于安全敏感的应用,推荐使用SHA256或SHA512。
- Base64编码会增加约33%的数据体积,因为每3个字节编码为4个字符。
十、数据限制与分组限制(limit)
此类功能(实际上是SQL子句)用于限制查询结果返回的行数,以及按组别限制返回的行数,对接口开发很友好
| 功能/子句 | 功能描述 | 示例 | 结果说明 |
|---|---|---|---|
LIMIT n |
限制查询结果返回的行数,只返回前n行。 | SELECT * FROM table_name LIMIT 5; SELECT name, age FROM users ORDER BY age DESC LIMIT 3; |
返回查询结果的前5行。 返回年龄最大的3个用户。 |
LIMIT n OFFSET m (或LIMIT m, n) |
从结果集的第m行开始(跳过前m行),返回接下来的n行。 | SELECT * FROM table_name LIMIT 5 OFFSET 10; SELECT * FROM table_name LIMIT 10, 5; |
跳过前10行,返回第11-15行。 同上,两种语法等价。 |
LIMIT n BY expr |
按表达式expr分组,每组返回最多n行。通常与ORDER BY结合使用,返回每组中的前n条记录。 |
SELECT department, name, salary FROM employees ORDER BY salary DESC LIMIT 2 BY department; SELECT date, user_id, action FROM logs ORDER BY timestamp DESC LIMIT 1 BY date, user_id; |
每个部门返回工资最高的2名员工。 每个用户每天返回最近的一条操作记录。 |
LIMIT n WITH TIES |
返回前n行,但如果第n行后有与第n行排序值相同的行,则也返回这些行。必须与ORDER BY一起使用。 |
SELECT name, score FROM students ORDER BY score DESC LIMIT 3 WITH TIES; SELECT product, sales FROM products ORDER BY sales DESC LIMIT 1 WITH TIES; |
返回前3名,如果有并列第3名,则返回所有并列的。 返回销量最高的产品,如果有多个并列第一则都返回。 |
注意:
- 性能影响 :
LIMIT不改变查询的扫描行数,只是限制了返回结果。如果查询没有合适的索引,LIMIT仍可能扫描全表。 - 结合ORDER BY :通常
LIMIT会与ORDER BY一起使用,以确保返回的是期望的"前n条"记录,否则返回的是任意n条。 - LIMIT BY 分组 :
LIMIT n BY expr是ClickHouse特有的扩展语法,非常适用于分组取Top N的场景,比如每个类别的最新N条记录。 - WITH TIES 的使用场景:当需要返回并列记录时使用,如排名场景,但会增加结果集的不确定性,需谨慎使用。
- 分页实现 :
LIMIT n OFFSET m常用于分页查询,但对于大数据量的深层分页性能较差(因为需要跳过大量记录)。