我有一个使用字节编码邮政编码的 DB2 database。有人告诉我,由于空间限制, mainframe 读取标准化的美国邮政编码并将其编码为字节格式(使用 COBOL)。 DB2 database 将编码的邮政编码读入一个 VARCHAR(9) 字段。有什么方法可以获取 DB2 输出并将其转换回原始邮政编码以表示数据,就好像它以普通 5-4 格式的邮政编码一样?
理想情况下,我的解决方案是在 SQL 中,但 python 或 C# 也会有所帮助。谢谢你。
以下是来自 mainframe 的编码邮政编码的一些示例。
134771824 地址是康涅狄格州哈特福德的,我希望它是 06103。
122900373 贝尔法斯特我 04915
在这个用例中,我正在处理后端 Teradata 仓库。我从 IBM DB2 database 获取这些信息,原始数据存储在 IBM COBOL mainframe 中。 mainframe 不保留原始邮政编码。
似乎我应该能够将 9 个数字操作回 5 个字符是目标
回答1
一个字符邮政编码将占用 9 个字节的字符数据(因此是 VARCHAR(9)),所以问题是承载编码邮政编码的列数据类型是什么?
鉴于缺少细节,这是推测,但我认为这是一个合理的有根据的猜测,即他们将 value 存储为 COBOL COMP-3 类型,该类型在 IBM Z 上压缩为十进制。下面是字符,然后是十六进制表示在他们之下。
Characters 123456789
Hex Values FFFFFFFFF
123456789
Characters ∨←
Hex Values 13579
2468F
可以看到第一个例子中的字符 values 占用了 9 个字节,而第二个例子中的字节数是 5。
根据您的问题,您可以:
COBOL
77 编码-ZIP PIC 9(9) 使用 COMP-3。 77 CHAR-ZIP PIC 9(9)。
将 CHAR-ZIP 移动到 ENCODED-ZIP。
阅读 Db2 行并将 zip 放入 CHAR-ZIP。移动它以获取 Db2 VARCHAR(9) 并将其放置在 PIC 9(9) 字段中,然后将其移动到 PIC 9(9) COMP-3。
请参阅此 [StackOverflow 答案](https://stackoverflow.com/questions/33011428/packed-decimal-to-zoned-decimal-or-decimal-conversion-python),因为它更广泛地解决了您的问题