问题:应用未校验导致「DT001 」与「DT001」视为不同值,查询/更新失效。
-- 仅去尾部空格
SELECT RTRIM(PRODUCT_ID) FROM PRODUCTS;
-- 兼容写法:去首尾空格
SELECT TRIM(PRODUCT_ID) FROM PRODUCTS;
-- UPDATE 修正存量脏数据
UPDATE PRODUCTS SET PRODUCT_ID = RTRIM(PRODUCT_ID);
LTRIM(str, chars) 可指定去除字符集,默认去空格。
场景:原 5 位产品编码扩展为 6 位,按类别在前缀填充「B/包装、C/客供、F/辅料」。
-- 在左侧填充 'F' 至长度 6
SELECT LPAD(PRODUCT_ID, 6, 'F') FROM PRODUCTS
WHERE CATEGORY = '辅料';
-- 截取首字符作为分类代码(长度大于目标长度时从右截取)
SELECT RPAD(PRODUCT_ID, 1) FROM PRODUCTS; -- 等同 SUBSTR(PRODUCT_ID,1,1)
RPAD(str, len, pad) 右侧填充,LPAD 左侧填充,均可用于报表定宽显示。
| 函数 | 效果 | 典型场景 |
|---|---|---|
| UPPER(str) | 全大写 | 产品编码、代码值统一大写 |
| LOWER(str) | 全小写 | 邮箱地址、URL 归一化 |
| INITCAP(str) | 每词首字母大写,其余小写 | 英文人名、地址规范化 (按空格/标点分词) |
-- 批量修正存量数据
UPDATE PRODUCTS SET PRODUCT_ID = UPPER(PRODUCT_ID)
WHERE PRODUCT_ID != UPPER(PRODUCT_ID);
场景:行政区划变更「下沙市」→「下沙区」,仅替换地址字段中该片段。
UPDATE CUSTOMERS
SET ADDRESS = REPLACE(ADDRESS, '下沙市', '下沙区')
WHERE ADDRESS LIKE '%下沙市%';
进阶组合:产品编码「PSD001」→ 报表显示「成批-手动工具-001」
SELECT
DECODE(SUBSTR(PROD_CODE,1,1), 'P', '成批', '其它') || '-' ||
DECODE(SUBSTR(PROD_CODE,2,2), 'SD', '手动工具', 'ZD', '自动工具', '其它') || '-' ||
SUBSTR(PROD_CODE,4) AS DISPLAY_NAME
FROM PRODUCTS;
或使用 CASE / REGEXP_REPLACE (10g+) 实现更灵活的模式替换。
WHERE UPPER(COL) = 'ABC'),建议创建函数索引:CREATE INDEX IDX_UPPER_COL ON TBL(UPPER(COL))。