Sql Oracle11g:与字符串等效

Sql 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

我有两张桌子

表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
连接两个表,例如
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。这就是正则表达式表示“或”。