powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите как вставить несколько значений условие ?
16 сообщений из 16, страница 1 из 1
Подскажите как вставить несколько значений условие ?
    #39433527
Wild-Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, подскажите !

Столкнулся с такой проблемой, каким образом можно вставить несколько значений в условие ?

У меня есть цикл, который выгружает данные из таблицы TR_SPRAV_FILT по условию из таблицы TEST_tr_transf_back.
Если в таблице TEST_tr_transf_back в поле ADR пусто, то выгружаются все записи из таблицы TR_SPRAV_FILT. Но в некоторых полях стоят значения, например при &nrasx = 9 поле ADR = "B;C", я это значение разбиваю на строки B и C, т.к. в поле t.kod4, таблицы TR_SPRAV_FILT есть значения либо B, либо С и др. Запрос выдаёт ошибку ORA-01427 single-row subquery returns more than one row

Подскажите пожалуйста каким способом можно вернуть условием более одной строки ?

Заранее благодарю !

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 IN 
            (CASE WHEN 
                 (SELECT 
                         /*t2.*,*/ MAX(column_value) ADR
                  FROM 
                         TEST_tr_transf_back t2
                       , TABLE(SELECT cast(collect(regexp_substr(ADR, '[^;]+', 1, level)) as sys.odcivarchar2list) 
                               FROM dual connect by level <= regexp_count(ADR, ';') + 1
                               )
                  WHERE 
                         t2.DTDATE = '31.12.2016'
                     AND t2.nfil = 'all'
                     AND t2.nrasx = &nrasx ---
                  ) IS NULL 
             THEN t.kod4 
             ELSE 
                 (SELECT 
                         column_value ADR
                  FROM 
                         TEST_tr_transf_back t2
                       , TABLE(SELECT cast(collect(regexp_substr(ADR, '[^;]+', 1, level)) as sys.odcivarchar2list) 
                               FROM dual connect by level <= regexp_count(ADR, ';') + 1
                               )
                  WHERE 
                         t2.DTDATE = '31.12.2016'
                     AND t2.nfil = 'all'
                     AND t2.nrasx = &nrasx ---
                  )
             END)
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433542
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wild-Jack,

хорошо б рабочий запрос в тестовый переделать с with ... select ... from dual union all select ... from dual и т.д.
проблема-то не сложная вроде, но проверить надо
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433563
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wild-Jack,

Код: plsql
1.
2.
3.
  ELSE 
                 (SELECT 
                         LISTAGG(column_value ....  ADR




.....
stax
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433564
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Filin,

Какое отношение у соединения в подзапросе? 1 к 1, 1 к n ?

в вырожденном случае instr(t.kod4,nvl(t2.adr,t.kod4),1) != 0
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433567
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав, предлагаешь обратно свернуть заботливо развёрнутое?
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433573
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wild-Jack,

Я не очень понял код, особенно без значений, но думаю надо исправлять так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 IN 
            (SELECT distinct nvl(regexp_substr(ADR, '[^;]+', 1, level), t.kod4)
               FROM TEST_tr_transf_back t2 
             WHERE t2.DTDATE = '31.12.2016'
                 AND t2.nfil = 'all'
                 AND t2.nrasx = &nrasx ---
             connect by level <= regexp_count(ADR, ';') + 1
)
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433578
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,
Код: plsql
1.
2.
with TEST_tr_transf_back  as (select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, 'A;;C;D' adr from dual),
      TR_SPRAV_FILT as (select 'B' kod4, date '2016-12-31' dtdate from dual)
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433584
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

по твоему примеру - вернет

а не очень понял, это может ли быть такой например случай
Код: plsql
1.
2.
3.
select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, 'A;;C;D' adr from dual union all
select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, null     adr from dual union all
select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, 'K'      adr from dual
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433590
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

хотя надо ли рассматривать 'A;;C;D' как набор
A
null
C
D

или как набор
A
C
D

и бывают ли такие случаи
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433592
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wild-Jack,

Может так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 is not null
   And exists 
            (SELECT *
               FROM TEST_tr_transf_back t2 
             WHERE t2.DTDATE = '31.12.2016'
                 AND t2.nfil = 'all'
                 AND t2.nrasx = &nrasx ---
              and ';'||nvl(ADR,t.kod4)||';' like '%;'|| t.kod4||';%'
)
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433596
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wild-Jack,

Точнее так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 is not null
   And exists 
            (SELECT *
               FROM dual left outer join TEST_tr_transf_back t2 
             on( t2.DTDATE = '31.12.2016'
                 AND t2.nfil = 'all'
                 AND t2.nrasx = &nrasx)
              where ';'||nvl(ADR,t.kod4)||';' like '%;'|| t.kod4||';%'
)
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433619
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envСтанислав, предлагаешь обратно свернуть заботливо развёрнутое?
поборем ж ORA-01427 single-row subquery returns more than one row

имхо там слетает

.....
stax
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433651
Wild-Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы, но поясню по требуемой задаче.

По таблице TEST_tr_transf_back я строю цикл
Примерные значения

Код: plsql
1.
2.
3.
4.
5.
select 'all' nfil, 1 nrasx, NULL  adr, TO_DATE('2016-12-31') dtdate from dual
 union all 
select 'all' nfil, 7 nrasx, 'C'   adr, TO_DATE('2016-12-31') dtdate from dual
 union all
select 'all' nfil, 9 nrasx, 'C;D' adr, TO_DATE('2016-12-31') dtdate from dual



т.е. циклом я выгружаю данные из таблицы TR_SPRAV_FILT
При nrasx = 1 выгружаются все данные из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN (t.kod4)

)
При nrasx = 7 выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C')

)
А вот при nrasx = 9 у меня загвоздка, т.к. выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C','B')

)
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433748
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wild-JackВсем спасибо за ответы, но поясню по требуемой задаче.

По таблице TEST_tr_transf_back я строю цикл
Примерные значения

Код: plsql
1.
2.
3.
4.
5.
select 'all' nfil, 1 nrasx, NULL  adr, TO_DATE('2016-12-31') dtdate from dual
 union all 
select 'all' nfil, 7 nrasx, 'C'   adr, TO_DATE('2016-12-31') dtdate from dual
 union all
select 'all' nfil, 9 nrasx, 'C;D' adr, TO_DATE('2016-12-31') dtdate from dual



т.е. циклом я выгружаю данные из таблицы TR_SPRAV_FILT
При nrasx = 1 выгружаются все данные из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN (t.kod4)

)
При nrasx = 7 выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C')

)
А вот при nrasx = 9 у меня загвоздка, т.к. выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C','B')

)


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
SQL> ed
Wrote file afiedt.buf

  1  with t1 as
  2  (select 'Ш' kod4, 'Stax' n from dual union all
  3   select 'C' kod4, 'Stanislav' n from dual union all
  4   select 'D' kod4, 'Станіслав' n from dual )
  5  ,t2 as (
  6  select 'all' nfil, 1 nrasx, NULL  adr, DATE '2016-12-31' dtdate from dual
  7   union all
  8  select 'all' nfil, 7 nrasx, 'C'   adr, DATE '2016-12-31' dtdate from dual
  9   union all
 10  select 'all' nfil, 9 nrasx, 'C;D' adr, DATE '2016-12-31' dtdate from dual
 11  )
 12  select * from t1
 13  where kod4 in (
 14    select t.column_value
 15    from t2,TABLE(SELECT cast(collect(regexp_substr(nvl(ADR,t1.kod4), '[^;]+', 1, level)) as sys.odcivarchar2list)
 16            FROM dual connect by level <= regexp_count(ADR, ';') + 1) t
 17    where nrasx=&nrasx
 18* )
SQL> /
old  17:   where nrasx=&nrasx
new  17:   where nrasx=7

K N
- ---------
C Stanislav

SQL> def nrasx=9
SQL> /
old  17:   where nrasx=&nrasx
new  17:   where nrasx=9

K N
- ---------
D Станіслав
C Stanislav

SQL> def nrasx=1
SQL> /
old  17:   where nrasx=&nrasx
new  17:   where nrasx=1

K N
- ---------
Ш Stax
C Stanislav
D Станіслав




.....
stax
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39433877
Wild-Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax.., спасибо Вам большое !
Очень выручили !
Всё гениальное просто...
...
Рейтинг: 0 / 0
Подскажите как вставить несколько значений условие ?
    #39434166
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,
зачем разворачивать ? уже давали совет 20369710 для твоего примера
Код: plsql
1.
2.
select * from t1,t2 where  instr(nvl(t2.adr,t1.kod4),t1.kod4 )>0
   and t2.nrasx=1
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите как вставить несколько значений условие ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]