sql - DB2 - 获取字符串中字符的多个位置的方法

标签 sql db2

因此,我很高兴使用一个非常古老的数据库,该数据库显然是在规范化发明之前设置的。我被要求看看是否能想出一种方法让它正常工作。

第一个表实际上有类似真正主键的东西。 示例:

ID, Reason
--- ----------
 1, Write off
 2, Overage
 3, OLH

问题是另一张表...

CustomerNum, JobNum, Reasons
------------ ------- ---------------------
      42351,     46, X
      32313,    456,    X
      85472,     13,   X    X

这些表是如何连接到他们的系统中的?是的,X 在行中的位置。因此,如果 X 位于第一个位置,则为原因 1,第二个位置为原因 2,依此类推。它本质上是一个平面阵列。如果他们将其限制为每行 1 X,那实际上还不错... (LOCATE('X', REASONS) as XINDEX) 但事实并非如此。理论上,每行有 21 个可能的 X 可以检查。

所以我必须向他们提供如何使其发挥作用的建议。
我的第一个建议是创建一个单独的表并规范化表,但是我不知道这会进行得如何,或者他们是否愿意更改他们的系统。
因此,我还想建议像存储过程这样的东西,它能够遍历每一行并返回索引,就像它们位于单独的表中一样。

我不知道这是否可能,但我充满希望。

编辑

所以,是的,我真的要插入链接表。
这是我根据建议找到的替代方案:

Select tblCustomers.*, 
CASE WHEN SUBSTRING(Reasons,1,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 1)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,2,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 2)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,3,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 3)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,4,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 4)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,5,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 5)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,6,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 6)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,7,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 7)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,8,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 8)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,9,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 9)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,10,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 10)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,11,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 11)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,12,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 12)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,13,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 13)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,14,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 14)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,15,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 15)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,16,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 16)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,17,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 17)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,18,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 18)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,19,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 19)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,20,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 20)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,21,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 21)) || ', ' ELSE '' END AS XPOS 
From tblCustomers

我将不得不稍微考虑一下马林的建议,看看它在多大程度上简化了它,但我喜欢这个查询的一件事是,它显示了他们当前的布局是多么荒谬,以及为什么他们应该改变它.

最佳答案

我真的很想推荐新的链接表,但这里要么是存储过程的核心内容,要么是填充链接表的方法:

SELECT Customers.CustomerNum, Reasons.ID
FROM Customers, Reasons
WHERE SUBSTR(Customers.Reasons, Reasons.ID, 1) = 'X'

关于sql - DB2 - 获取字符串中字符的多个位置的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845328/

相关文章:

mysql 选择唯一行

c# - 就数据库表设计、估算表提出建议

java - 从 Java 调用 RPG 程序时 SaveObject 作业失败

database - 如何使用 DB2 SQL 将 DECFLOAT 更改为 INT?

database - 覆盖索引与聚集索引(数据库索引)

db2 - 是否有可用于 DB2 驱动程序的 JavaDoc?

sql - PostgreSQL:递增否则插入

php - 用一个sql查询选择两行

mysql - 在 SQL 中创建唯一的字符/数字字符串

java - 在 Spring Data JPA 的 native SQL 查询中使用命名参数