首页 > 解决方案 > 有没有办法根据每个单独字段(DB2 或其他)的内容逐行修改表中的字段?

问题描述

我有一个 DB2 表,其中有一个包含特定值(社会安全号码)的字段。我需要根据字段的内容修改每一行的字段值。我获取原始字段的值并基于它创建一个新值。基本上我使用原始值作为种子来创建一个新值,所以我需要知道每个值并根据它更新字段......我很抱歉如此含糊,我仍在尝试了解这一切。

此 SQL 将所有值更改为一个错误的值 Update Table set SSN = '123-45-6789'

我需要:

  1. 获取字段值
  2. 使用当前值作为种子,使用简单的公式对其进行屏蔽

619-46-0988--->427-95-1143
424-09-8912--->699-01-4628
619-46-0988--->427-95-1143

请注意,619-46-0988 始终如一地更改,因为原始值是相同的

非常感谢,

芭芭拉

标签: sqldatabasepowershelldb2

解决方案


可能是最简单的屏蔽函数示例。
具有恒定第二参数的独特 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       |

推荐阅读