当数据类似于结果查询中的“测试”,“测试”时,IN条件不起作用

时间:2018-12-13 14:17:52

标签: sql oracle plsql

在一个表中,我有一列的数据类似“ Test1”,“ Test2”。为什么我不能在具有IN条件的另一个选择查询中使用此列数据。

Example:

Table TESTING2:

AREA_NAME
-------------------------------
'Tilaknagar','Kadubeesinahalli'

Table TESTING1:

NAME    AREA
----    ----------------
Ravi    Tilaknagar
Ram     Kadubeesinahalli

如果我写查询

SELECT *
FROM TESTING1
WHERE AREA IN (SELECT AREA_NAME FROM TESTING2);

不起作用。如何使它正常工作。

4 个答案:

答案 0 :(得分:1)

您可以尝试使用curl函数来替换replace逗号,然后使用'来分隔逗号。

regexp_substr

查询1

CREATE TABLE TESTING2(
   AREA_NAME VARCHAR(500)
);

INSERT INTO TESTING2 VALUES ('''Tilaknagar'',''Kadubeesinahalli''');


CREATE TABLE TESTING1(
   NAME VARCHAR(50),
   AREA VARCHAR(500)
);

INSERT INTO TESTING1 VALUES ('Ravi','Tilaknagar');
INSERT INTO TESTING1 VALUES ('Ram','Kadubeesinahalli');

Results

SELECT * 
FROM TESTING1 
WHERE AREA IN (
    SELECT regexp_substr(replace(AREA_NAME,'''','') , '[^,]+', 1, x.n)
    FROM TESTING2 
    cross join (SELECT ROWNUM n FROM dual CONNECT BY ROWNUM <= 5) x
)

注意

| NAME | AREA | |------|------------------| | Ravi | Tilaknagar | | Ram | Kadubeesinahalli | 的数字需要设置为大于CONNECT BY ROWNUM <= 5列的逗号数量。

答案 1 :(得分:1)

这是一个非常糟糕的表设计。您应该考虑更改它并标准化表格。存储逗号分隔的值势必会引起问题。

您可以执行以下操作。这可能比Regexp解决方案稍微有效。

SELECT *
FROM testing1 t1
WHERE EXISTS (
     SELECT 1
     FROM testing2 t2
     WHERE ',' || t2.area_name || ',' LIKE '%,''' || t1.area || ''',%'
);

Demo

答案 2 :(得分:0)

“ IN”子句可用于从一个表中提取数据,并使用它过滤驱动表。两个表上使用的列上的值必须完全匹配(大小写,顺序等)。如果它们不匹配,则不会返回任何行。

答案 3 :(得分:0)

正如已经指出的那样,这是一个非常糟糕的设计。但是更简单的查询也可以解决该请求。希望你的桌子不大。

select distinct t1.* 
  from testing1 t1
     , testing2 t2
 where instr(t2.area_name,t1.area) > 0;