⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
共享宏

DuckDB 具有强大的 宏机制,可以为常见任务创建快捷方式。

共享标量宏

首先,我们定义了一个宏,它将非负整数美观地打印为短字符串,包含千、百万和十亿单位(不进行四舍五入),如下所示

duckdb pretty_print_integer_macro.duckdb
CREATE MACRO pretty_print_integer(n) AS
    CASE
        WHEN n >= 1_000_000_000 THEN printf('%dB', n // 1_000_000_000)
        WHEN n >= 1_000_000     THEN printf('%dM', n // 1_000_000)
        WHEN n >= 1_000         THEN printf('%dk', n // 1_000)
        ELSE printf('%d', n)
    END;

SELECT pretty_print_integer(25_500_000) AS x;
┌─────────┐
│    x    │
│ varchar │
├─────────┤
│ 25M     │
└─────────┘

正如预期,该宏会持久化到数据库中。但这同时也意味着我们可以将其托管在 HTTPS 端点上并与任何人共享!我们已将此宏发布到 blobs.duckdb.org

您可以在 DuckDB 中尝试它

duckdb

请确保 httpfs 扩展已安装

INSTALL httpfs;

您现在可以连接到远程端点并使用该宏

ATTACH 'https://blobs.duckdb.org/data/pretty_print_integer_macro.duckdb'
    AS pretty_print_macro_db;

SELECT pretty_print_macro_db.pretty_print_integer(42_123) AS x;
┌─────────┐
│    x    │
│ varchar │
├─────────┤
│ 42k     │
└─────────┘

共享表宏

也可以共享表宏。例如,我们创建了 checksum,如下所示

duckdb compute_table_checksum.duckdb
CREATE MACRO checksum(table_name) AS TABLE
    SELECT bit_xor(md5_number(COLUMNS(*)::VARCHAR))
    FROM query_table(table_name);

要使用它,请确保 httpfs 扩展已安装

INSTALL httpfs;

您可以连接到远程端点并使用该宏

ATTACH 'https://blobs.duckdb.org/data/compute_table_checksum.duckdb'
    AS compute_table_checksum_db;

CREATE TABLE stations AS
    FROM 'https://blobs.duckdb.org/stations.parquet';

.mode line
FROM compute_table_checksum_db.checksum('stations');
         id = -132780776949939723506211681506129908318
       code = 126327004005066229305810236187733612209
        uic = -145623335062491121476006068124745817380
 name_short = -114540917565721687000878144381189869683
name_medium = -568264780518431562127359918655305384
  name_long = 126079956280724674884063510870679874110
       slug = -53458800462031706622213217090663245511
    country = 143068442936912051858689770843609587944
       type = 5665662315470785456147400604088879751
    geo_lat = 160608116135251821259126521573759502306
    geo_lng = -138297281072655463682926723171691547732