sql - 有没有办法根据每个单独字段(DB2 或其他)的内容逐行修改表中的字段?
问题描述
我有一个 DB2 表,其中有一个包含特定值(社会安全号码)的字段。我需要根据字段的内容修改每一行的字段值。我获取原始字段的值并基于它创建一个新值。基本上我使用原始值作为种子来创建一个新值,所以我需要知道每个值并根据它更新字段......我很抱歉如此含糊,我仍在尝试了解这一切。
此 SQL 将所有值更改为一个错误的值 Update Table set SSN = '123-45-6789'
我需要:
- 获取字段值
- 使用当前值作为种子,使用简单的公式对其进行屏蔽
619-46-0988--->427-95-1143
424-09-8912--->699-01-4628
619-46-0988--->427-95-1143
请注意,619-46-0988 始终如一地更改,因为原始值是相同的
非常感谢,
芭芭拉
解决方案
可能是最简单的屏蔽函数示例。
具有恒定第二参数的独特 SSN 集的独特且一致的结果。
CREATE OR REPLACE FUNCTION SSN_MASK(P_SSN VARCHAR(11), P_MASK VARCHAR(9))
RETURNS VARCHAR(11)
CONTAINS SQL
DETERMINISTIC
NO EXTERNAL ACTION
RETURN
CASE
WHEN
REGEXP_LIKE(P_SSN, '^[\d]{3}-[\d]{2}-[\d]{4}$')
AND REGEXP_LIKE(P_MASK, '^[\d]{9}$')
THEN
MOD(INT(SUBSTR(P_SSN, 1, 1)) + INT(SUBSTR(P_MASK, 1, 1)), 10)
|| MOD(INT(SUBSTR(P_SSN, 2, 1)) + INT(SUBSTR(P_MASK, 2, 1)), 10)
|| MOD(INT(SUBSTR(P_SSN, 3, 1)) + INT(SUBSTR(P_MASK, 3, 1)), 10)
|| '-'
|| MOD(INT(SUBSTR(P_SSN, 5, 1)) + INT(SUBSTR(P_MASK, 4, 1)), 10)
|| MOD(INT(SUBSTR(P_SSN, 6, 1)) + INT(SUBSTR(P_MASK, 5, 1)), 10)
|| '-'
|| MOD(INT(SUBSTR(P_SSN, 8, 1)) + INT(SUBSTR(P_MASK, 6, 1)), 10)
|| MOD(INT(SUBSTR(P_SSN, 9, 1)) + INT(SUBSTR(P_MASK, 7, 1)), 10)
|| MOD(INT(SUBSTR(P_SSN, 10, 1)) + INT(SUBSTR(P_MASK, 8, 1)), 10)
|| MOD(INT(SUBSTR(P_SSN, 11, 1)) + INT(SUBSTR(P_MASK, 9, 1)), 10)
END
;
SELECT V, SSN_MASK(V, '123456789') V_MASKED
FROM
(
VALUES
'619-46-0988'
, '424-09-8912'
, '619-46-0988'
, 'ABC'
) T(V);
The result is:
|V |V_MASKED |
|-----------|-----------|
|619-46-0988|732-81-6667|
|424-09-8912|547-44-4691|
|619-46-0988|732-81-6667|
|ABC |NULL |
推荐阅读
- c# - 属性 UnityEngine.RequireComponent 在此声明类型上无效。它仅对类声明有效
- java - Apache POI - 如何将单元格值设置为日期格式?
- facebook - 未捕获的错误:发生缩小的异常 [Facebook 登录]
- algorithm - 如何解决递归 T(n) = T(nc) +T(c) + n^2
- rubygems - 在 Jekyll 上运行 KaTeX?
- string - 当日期格式为 yyyy-mm-dd 时,如何在 mvc core c# 中进行日期搜索?
- php - 如何从多字符串中仅获取日期
- pandas - 读取 EMNIST 数据集
- content-management-system - Umbraco VS 工艺 CMS
- python - 将 pandas 表保存到特定目录