ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DuckDB教程:格式化函数

DuckDB教程:格式化函数 DuckDB 提供了一些通用的字符串格式化函数本文主要介绍 format() 函数与 printf() 函数。《DuckDB 教程》使用的示例表和数据https://github.com/dongxuyang1985/duckdb_tutorialformat 函数format(fmt, …) 函数使用 Python 风格格式字符串用于构造格式化文本。例如SELECTformat({} world,Hello)ASstr;┌─────────────┐ │ str │ │varchar│ ├─────────────┤ │ Hello world │ └─────────────┘其中大括号{}代表格式占位符执行时使用后续的参数进行替代。如果存在多个替代参数可以使用它们出现的位置进行引用。例如SELECTformat({1}月薪{0}元,salary,emp_name)ASstrFROMemployeeLIMIT3;┌─────────────────────┐ │ str │ │varchar│ ├─────────────────────┤ │ 刘备月薪30000.0元 │ │ 关羽月薪26000.0元 │ │ 张飞月薪24000.0元 │ └─────────────────────┘注意参数位置从 0 开始计算。format() 函数支持的常用格式说明符如下格式说明符描述示例{:d}整数654321{:E}科学计数法3.141593E00{:f}浮点数4.560000{:o}八进制数字2375761{:s}字符串asd{:x}十六进制数字9fbf1{:tX}整数X代表千位分符号654 321更多格式说明符可以参考https://fmt.dev/latest/syntax/以下是一些示例-- 布尔值SELECTformat({} ! {},true,false)ASstr;┌───────────────┐ │ str │ │varchar│ ├───────────────┤ │true!false│ └───────────────┘-- 日期时间SELECTformat({},hire_date)FROMemployeeLIMIT1;┌─────────────────────────┐ │format({},hire_date)│ │varchar│ ├─────────────────────────┤ │2000-01-01│ └─────────────────────────┘-- 整数补零SELECTformat({:04d},33);┌──────────────────────┐ │format({:04d},33)│ │varchar│ ├──────────────────────┤ │0033│ └──────────────────────┘-- 浮点数SELECTformat({:.2f},123.456);┌───────────────────────────┐ │format({:.2f},123.456)│ │varchar│ ├───────────────────────────┤ │123.46│ └───────────────────────────┘-- 基于数字生成时间戳字符串SELECTformat({:02d}:{:02d}:{:02d} {},12,3,16,AM);┌────────────────────────────────────────────────────┐ │format({:02d}:{:02d}:{:02d} {},12,3,16,AM)│ │varchar│ ├────────────────────────────────────────────────────┤ │12:03:16AM │ └────────────────────────────────────────────────────┘-- 整数转换为二进制SELECTformat({:b},123_456_789);┌─────────────────────────────┐ │format({:b},123456789)│ │varchar│ ├─────────────────────────────┤ │111010110111100110100010101│ └─────────────────────────────┘-- 千位分隔符SELECTformat({:t,},123_456_789);┌────────────────────────────┐ │format({:t,},123456789)│ │varchar│ ├────────────────────────────┤ │123,456,789│ └────────────────────────────┘printf 函数printf(fmt, …) 函数是 DuckDB 提供的 C 风格字符串格式化函数语法与 C/C、PostgreSQL 中的 printf 基本一致。例如SELECTprintf(%s world,Hello)ASstr;┌─────────────┐ │ str │ │varchar│ ├─────────────┤ │ Hello world │ └─────────────┘其中%s 代表字符串占位符执行时使用后续的参数进行替代。如果使用位置参数进行格式化表示方法为 %position$formatter。例如SELECTprintf(%2$s月薪%1$f元,salary,emp_name)ASstrFROMemployeeLIMIT3;┌──────────────────────────┐ │ str │ │varchar│ ├──────────────────────────┤ │ 刘备月薪30000.000000元 │ │ 关羽月薪26000.000000元 │ │ 张飞月薪24000.000000元 │ └──────────────────────────┘注意参数位置从 1 开始计算%1$f 表示第一个位置参数类型为浮点数。printf() 函数支持的常用格式说明符如下格式说明符描述示例%c字符编码转换为字符a%d整数654321%Xd包含千位分隔符X,、.、、_的整数654_321%E科学计数法3.141593E00%f浮点数4.560000%hd整数654321%hhd整数654321%lld整数654321%o八进制数字2375761%s字符串asd%x十六进制数字9fbf1更多格式说明符可以参考https://cplusplus.com/reference/cstdio/printf/同样来看一些示例。-- 布尔值SELECTprintf(%s ! %s,true,false)ASstr;┌───────────────┐ │ str │ │varchar│ ├───────────────┤ │true!false│ └───────────────┘-- 日期时间SELECTprintf(%s,hire_date)FROMemployeeLIMIT1;┌─────────────────────────┐ │ printf(%s,hire_date)│ │varchar│ ├─────────────────────────┤ │2000-01-01│ └─────────────────────────┘-- 整数补零SELECTprintf(%04d,33);┌────────────────────┐ │ printf(%04d,33)│ │varchar│ ├────────────────────┤ │0033│ └────────────────────┘-- 浮点数SELECTprintf(%.2f,123.456);┌─────────────────────────┐ │ printf(%.2f,123.456)│ │varchar│ ├─────────────────────────┤ │123.46│ └─────────────────────────┘-- 基于数字生成时间戳字符串SELECTprintf(%02d:%02d:%02d %s,12,3,16,AM);┌──────────────────────────────────────────────┐ │ printf(%02d:%02d:%02d %s,12,3,16,AM)│ │varchar│ ├──────────────────────────────────────────────┤ │12:03:16AM │ └──────────────────────────────────────────────┘-- 整数转换为二进制SELECTprintf(%b,123_456_789);┌─────────────────────────────┐ │ printf(%b,123456789)│ │varchar│ ├─────────────────────────────┤ │111010110111100110100010101│ └─────────────────────────────┘-- 千位分隔符SELECTprintf(%,d,123_456_789);┌──────────────────────────┐ │ printf(%,d,123456789)│ │varchar│ ├──────────────────────────┤ │123,456,789│ └──────────────────────────┘如果你熟悉 C/C、Linux、PostgreSQL推荐使用 printf()如果熟悉 Python推荐使用 format()通常它比 printf() 更直观易读。
返回列表