在这里插入图片描述

LOWER 函数使用手册

函数定义

LOWER(expr)

功能说明

一句话描述: 将字符串中的所有大写字母转换为小写字母。

将输入字符串 expr 中的所有大写字母字符转换为对应的小写形式,非字母字符保持不变。

参数说明

参数 说明 类型 必填
expr 待转换的字符串 VARCHAR、NCHAR

返回值

  • 类型: 与输入参数类型一致(VARCHAR 或 NCHAR)
  • 长度: 与输入字符串长度相同
  • NULL 处理: 如果输入为 NULL,返回 NULL

适用范围

  • 数据类型: VARCHAR、NCHAR
  • 适用于: 表和超级表
  • 子查询: 支持内层和外层查询

基础示例

-- 基本用法
taos> SELECT LOWER('TDengine');
 lower('TDengine') |
====================
 tdengine          |

-- 包含数字和特殊字符
taos> SELECT LOWER('Device-2024_ABC');
 lower('Device-2024_ABC') |
===========================
 device-2024_abc          |

-- 中英文混合
taos> SELECT LOWER('Beijing北京2024');
 lower('Beijing北京2024') |
==========================
 beijing北京2024          |

-- NULL 值处理
taos> SELECT LOWER(NULL);
 lower(NULL) |
==============
 NULL        |

使用场景示例

场景 1: 设备位置信息标准化

业务需求: 统一设备位置信息的大小写格式,便于数据查询和统计

-- 创建智能电表超级表
CREATE STABLE test.meters (
    `ts` TIMESTAMP,
    `current` FLOAT,
    `voltage` INT,
    `phase` FLOAT
) TAGS (
    `groupid` INT,
    `location` VARCHAR(100)
);

-- 插入测试数据(位置信息大小写不统一)
INSERT INTO test.d001 USING test.meters TAGS(1, 'Beijing-Chaoyang-Building-A')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);

INSERT INTO test.d002 USING test.meters TAGS(2, 'SHANGHAI-Pudong-Tower-B')
VALUES ('2024-01-15 08:00:00', 12.3, 221, 0.88);

INSERT INTO test.d003 USING test.meters TAGS(3, 'guangzhou-TIANHE-Plaza-C')
VALUES ('2024-01-15 08:00:00', 9.8, 219, 0.82);

-- 标准化位置信息为小写
SELECT 
    tbname,
    location AS original_location,
    LOWER(location) AS standardized_location,
    voltage,
    current
FROM test.meters;

输出示例:

tbname | original_location           | standardized_location       | voltage | current
-------|-----------------------------|-----------------------------|---------|--------
d001   | Beijing-Chaoyang-Building-A | beijing-chaoyang-building-a | 220     | 10.5
d002   | SHANGHAI-Pudong-Tower-B     | shanghai-pudong-tower-b     | 221     | 12.3
d003   | guangzhou-TIANHE-Plaza-C    | guangzhou-tianhe-plaza-c    | 219     | 9.8

目的: 统一数据格式,消除大小写差异导致的查询问题


场景 2: 不区分大小写的位置查询

业务需求: 查询特定城市的设备,忽略用户输入的大小写

-- 不区分大小写查询北京地区的设备
SELECT 
    tbname,
    location,
    voltage,
    current
FROM test.meters
WHERE LOWER(location) LIKE '%beijing%'
ORDER BY current DESC;

输出示例:

tbname | location                     | voltage | current
-------|------------------------------|---------|--------
d001   | Beijing-Chaoyang-Building-A  | 220     | 10.5
d004   | BEIJING-Haidian-Park-D       | 222     | 11.2

目的: 提升用户体验,避免因大小写不匹配导致的查询遗漏


场景 3: 区域统计(忽略大小写差异)

业务需求: 按城市统计设备数量和平均电压,消除大小写导致的重复分组

-- 插入更多测试数据
INSERT INTO test.d004 USING test.meters TAGS(4, 'BEIJING-Haidian-Park-D')
VALUES ('2024-01-15 08:00:00', 11.2, 222, 0.90);

INSERT INTO test.d005 USING test.meters TAGS(5, 'beijing-Dongcheng-Mall-E')
VALUES ('2024-01-15 08:00:00', 10.8, 220, 0.87);

-- 按城市统计(标准化大小写)
SELECT 
    LOWER(SUBSTRING(location, 1, POSITION('-' IN location) - 1)) AS city,
    COUNT(*) AS device_count,
    ROUND(AVG(voltage), 2) AS avg_voltage,
    ROUND(AVG(current), 2) AS avg_current
FROM test.meters
GROUP BY city
ORDER BY device_count DESC;

输出示例:

city      | device_count | avg_voltage | avg_current
----------|--------------|-------------|-------------
beijing   | 3            | 220.67      | 10.83
shanghai  | 1            | 221.00      | 12.30
guangzhou | 1            | 219.00      | 9.80

目的: 正确聚合统计数据,避免因大小写差异产生错误的分组


场景 4: 数据清洗和验证

业务需求: 检查位置信息的数据质量,识别不符合命名规范的记录

-- 检查位置信息是否全部为小写(标准格式)
SELECT 
    tbname,
    location,
    CASE 
        WHEN location = LOWER(location) THEN '符合规范'
        ELSE '需要修正'
    END AS format_check,
    LENGTH(location) - LENGTH(LOWER(location)) AS uppercase_count
FROM test.meters
WHERE location != LOWER(location);

输出示例:

tbname | location                    | format_check | uppercase_count
-------|-----------------------------|--------------|-----------------
d002   | SHANGHAI-Pudong-Tower-B     | 需要修正     | 9
d003   | guangzhou-TIANHE-Plaza-C    | 需要修正     | 6
d004   | BEIJING-Haidian-Park-D      | 需要修正     | 7

目的: 数据质量监控,发现需要规范化的数据


场景 5: 设备型号标准化

业务需求: 标准化设备型号信息,便于统一管理

-- 假设增加设备型号标签
ALTER STABLE test.meters ADD TAG model VARCHAR(50);

-- 插入带型号的数据
INSERT INTO test.d006 USING test.meters TAGS(6, 'shenzhen-nanshan-center-f', 'Model-ABC-2024')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);

INSERT INTO test.d007 USING test.meters TAGS(7, 'shenzhen-nanshan-center-g', 'MODEL-abc-2024')
VALUES ('2024-01-15 08:00:00', 10.3, 219, 0.84);

-- 标准化型号并统计
SELECT 
    LOWER(model) AS standard_model,
    COUNT(*) AS device_count,
    ROUND(AVG(voltage), 2) AS avg_voltage
FROM test.meters
WHERE model IS NOT NULL
GROUP BY standard_model;

输出示例:

standard_model  | device_count | avg_voltage
----------------|--------------|-------------
model-abc-2024  | 2            | 219.50

目的: 统一设备型号格式,避免因大小写不同导致的重复统计


场景 6: 结合 UPPER 函数的数据对比

业务需求: 比对原始数据与标准化数据的差异

-- 查看原始位置与标准化后的对比
SELECT 
    tbname,
    location AS original,
    UPPER(location) AS all_upper,
    LOWER(location) AS all_lower,
    CASE 
        WHEN location = UPPER(location) THEN '全大写'
        WHEN location = LOWER(location) THEN '全小写'
        ELSE '大小写混合'
    END AS case_type
FROM test.meters
LIMIT 5;

输出示例:

tbname | original                     | all_upper                    | all_lower                    | case_type
-------|------------------------------|------------------------------|------------------------------|------------
d001   | Beijing-Chaoyang-Building-A  | BEIJING-CHAOYANG-BUILDING-A  | beijing-chaoyang-building-a  | 大小写混合
d002   | SHANGHAI-Pudong-Tower-B      | SHANGHAI-PUDONG-TOWER-B      | shanghai-pudong-tower-b      | 全大写
d003   | guangzhou-TIANHE-Plaza-C     | GUANGZHOU-TIANHE-PLAZA-C     | guangzhou-tianhe-plaza-c     | 大小写混合

目的: 可视化数据格式差异,辅助数据清洗决策


与 UPPER 函数的对比

函数 功能 示例输入 示例输出
LOWER 转小写 'TDengine-2024' 'tdengine-2024'
UPPER 转大写 'TDengine-2024' 'TDENGINE-2024'

实际应用优势

1. 提升查询准确性

-- 不使用 LOWER (可能遗漏数据)
SELECT * FROM test.meters WHERE location LIKE '%beijing%';  -- 可能查不到 'Beijing' 或 'BEIJING'

-- 使用 LOWER (不会遗漏)
SELECT * FROM test.meters WHERE LOWER(location) LIKE '%beijing%';  -- 查到所有包含 beijing 的记录

2. 简化数据导入

-- 导入时自动标准化
INSERT INTO test.meters (ts, location, ...)
SELECT ts, LOWER(location), ...
FROM staging_table;

3. 数据去重

-- 基于标准化后的位置去重
SELECT DISTINCT LOWER(location) AS unique_locations
FROM test.meters;

性能考虑

  1. 索引影响: 在 WHERE 子句中使用 LOWER() 可能无法使用索引
  2. 优化建议:
    • 对于频繁查询的字段,考虑在插入时就标准化
    • 或创建计算列存储标准化后的值
  3. 大数据量: 对超大数据集使用时,注意查询性能

注意事项

  1. 字符集支持: 支持 ASCII 和 UTF-8 字符
  2. 多字节字符: 中文等多字节字符保持不变
  3. NULL 处理: 输入 NULL 返回 NULL
  4. 不可变性: 不会修改原始数据,仅返回转换结果
  5. 区域设置: 某些特殊字符的大小写转换可能受区域设置影响

相关函数

  • UPPER(): 转换为大写
  • LTRIM(): 去除左侧空格
  • RTRIM(): 去除右侧空格
  • TRIM(): 去除两侧空格
  • LENGTH(): 获取字符串长度
  • CHAR_LENGTH(): 获取字符数

完整示例:设备管理系统

-- 综合应用:设备位置信息标准化查询与统计
WITH standardized_locations AS (
    SELECT 
        tbname,
        LOWER(location) AS std_location,
        LOWER(SUBSTRING(location, 1, POSITION('-' IN location) - 1)) AS city,
        voltage,
        current,
        ts
    FROM test.meters
)
SELECT 
    city,
    COUNT(DISTINCT tbname) AS device_count,
    COUNT(DISTINCT std_location) AS location_count,
    ROUND(AVG(voltage), 2) AS avg_voltage,
    ROUND(AVG(current), 2) AS avg_current,
    MIN(voltage) AS min_voltage,
    MAX(voltage) AS max_voltage
FROM standardized_locations
WHERE ts >= '2024-01-01'
GROUP BY city
ORDER BY device_count DESC;

这个综合示例展示了如何使用 LOWER 函数实现:

  • 位置信息标准化
  • 不区分大小写的城市提取
  • 跨城市的设备统计分析
  • 电压等指标的聚合计算

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐