Условие IN не работает, когда данные похожи на 'Test', 'Test' из запроса результата - PullRequest
0 голосов
/ 13 декабря 2018

В одной таблице у меня есть данные типа «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 голосов
/ 15 декабря 2018

Как уже указывалось, это очень плохой дизайн.Но более простой запрос также решает запрос.Надеюсь, ваши столы не большие.

select distinct t1.* 
  from testing1 t1
     , testing2 t2
 where instr(t2.area_name,t1.area) > 0;
0 голосов
/ 13 декабря 2018

Вы можете попробовать использовать функцию replace для замены ' запятой, затем regexp_substr для разделения запятой.

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');

Запрос 1 :

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 число необходимо установить больше AREA_NAME сумма запятой в столбце.

0 голосов
/ 13 декабря 2018

Это очень плохой дизайн стола.Вы должны рассмотреть возможность его изменения и нормализации таблицы.Хранение значений через запятую обязательно вызовет проблемы.

Вы можете сделать что-то подобное.Это может быть немного эффективнее, чем решения Regexp.

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

Демо

0 голосов
/ 13 декабря 2018

Предложение «IN» может использоваться для извлечения данных из одной таблицы и использования ее для фильтрации таблицы управления.Значение из обеих таблиц в используемых столбцах должно соответствовать ТОЧНО (регистр, порядок и т. Д.).Если они не совпадают, строки не возвращаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...