Sql Oracle11g:与字符串等效
我有两张桌子 表T1Sql Oracle11g:与字符串等效,sql,oracle11g,Sql,Oracle11g,我有两张桌子 表T1 CODE | INDS | A .. -----+-------+---- 10 | 1,2,3 | foo 11 | 1,2,3 | bar 表T2 CODE | IND | X .. -----+-----+------ 10 | 1 | 10 | 2 | 10 | 3 | 11 | 1 | 11 | 2 | 11 | 3 | 我正在尝试编写一个SQL查询,它将为相同的code和IND连接两个表,例如indi
CODE | INDS | A ..
-----+-------+----
10 | 1,2,3 | foo
11 | 1,2,3 | bar
表T2
CODE | IND | X ..
-----+-----+------
10 | 1 |
10 | 2 |
10 | 3 |
11 | 1 |
11 | 2 |
11 | 3 |
我正在尝试编写一个SQL查询,它将为相同的code
和IND
连接两个表,例如indin(INDS)
比如:
SELECT T1.A, T2.X
FROM T1, T2
WHERE T1.CODE = T2.CODE
AND T2.IND IN (T1.INDS)
它不会像中那样工作,不需要字符串,而是逗号分隔的值
SELECT T1.A
, T2.X
FROM T1
, T2
WHERE T1.CODE = T2.CODE
AND INSTR(T1.INDS, T2.IND) > 0
问题
如何使用SQL查询实现这一点?尝试使用
INSTR
函数在逗号分隔的值中搜索数字
SELECT T1.A
, T2.X
FROM T1
, T2
WHERE T1.CODE = T2.CODE
AND INSTR(T1.INDS, T2.IND) > 0
你有一个非常非常糟糕的数据结构。您不应该将ID存储在字符串中。为什么不呢
- 数字不应存储为字符串
- ID应该正确声明外键关系
- SQL具有糟糕的字符串处理能力
- 您的数据结构妨碍优化
- SQL有一个很好的数据类型来存储列表。它叫桌子。(Oracle还有其他机制。)
SELECT T1.A, T2.X
FROM T1 JOIN
T2
ON T1.CODE = T2.CODE AND
',' || T1.INDS || ',' LIKE '%,' || T2.IND || ',%';
您还可以使用regexp\u like()
来表达这一点:
这应该行得通
SELECT a, x
FROM t1, t2
WHERE t1.code = t2.code
and regexp_like(inds,'(^|,)'||ind||'(,|$)')
永远不要将数据存储为逗号分隔的项目。这只会给你带来很多麻烦。谢谢。但那是我必须面对的问题。尽管我说不出使用coma分隔值(除了CSV?)有什么不对,但它违反了称为第一范式的数据规范化的基本设计前提。我必须在工作中处理类似的数据结构。有时您只需要处理遗留代码/数据。谢谢!我注意到您在第二个查询中用管道字符替换了逗号。你能解释一下它的好处吗?@HeyStackExchange。这就是正则表达式表示“或”。