powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помоготе упростить список значений в IN (наверное, регулярное выражение)
10 сообщений из 10, страница 1 из 1
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39851769
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть готовый запрос куда могу подкинуть только условие.
в условие надо добавить 15 однотипных значений
Код: sql
1.
SUBJECTID IN ('GROUPFORCONTRACTSUBJECT_21', 'GROUPFORCONTRACTSUBJECT_23', 'GROUPFORCONTRACTSUBJECT_24', ...)


можно ли GROUPFORCONTRACTSUBJECT_21 заменить маской, а в условие добавить только цифры?
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39851773
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39851779
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Железный вариант:
Код: plsql
1.
substr(SUBJECTID,1,24) = 'GROUPFORCONTRACTSUBJECT_' and substr(SUBJECTID,25,2) in ('21','23','24')



Вариант для самоуверенных:
Код: plsql
1.
replace(SUBJECTID,'GROUPFORCONTRACTSUBJECT_') in ('21','23','24')
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39851795
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkr15 однотипных значений Не так много, чтобы пережевывать на форуме. На другой чаше весов выражение от поля может: исключить доступ по индексу, фильтр сторейджа, менее точная оценка кардиналити, усложнение последующего изменения условия под нетипичные значения.
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39851908
Сергей из Самары
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkr,

Код: plsql
1.
regexp_replace(SUBJECTID,'*[^[:digit:]]*') in (21,22,23,...)
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39851913
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей из Самары
Код: plsql
1.
regexp_replace(SUBJECTID,'*[^[:digit:]]*') in (21,22,23,...)

Тебе ещё совсем рано советовать.
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39852055
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooЖелезный вариант:


Да ну?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with t as (select 'GROUPFORCONTRACTSUBJECT_219' SUBJECTID from dual)
select * from t
where substr(SUBJECTID,1,24) = 'GROUPFORCONTRACTSUBJECT_' and substr(SUBJECTID,25,2) in ('21','23','24')
/

SUBJECTID
---------------------------
GROUPFORCONTRACTSUBJECT_219

with t as (select 'GROUPFORCONTRACTSUBJECT_219' SUBJECTID from dual)
select * from t
where substr(SUBJECTID,1,24) = 'GROUPFORCONTRACTSUBJECT_' and substr(SUBJECTID,25) in ('21','23','24')
/
 
no rows selected

SQL> 



Использование SUBSTR, как -2- и указал, "может: исключить доступ по индексу". Посему правильнее:

Код: plsql
1.
SUBJECTID like 'GROUPFORCONTRACTSUBJECT\_%' escape '\' and substr(SUBJECTID,25) in ('21','23','24')



Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
SQL> explain plan for
  2  select * from tbl
  3  where substr(SUBJECTID,1,24) = 'GROUPFORCONTRACTSUBJECT_' and substr(SUBJECTID,25) in ('21','23','24')
  4  /

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------
Plan hash value: 2144214008

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    28 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TBL  |     1 |    28 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------

   1 - filter(SUBSTR("SUBJECTID",1,24)='GROUPFORCONTRACTSUBJECT_' AND
              (SUBSTR("SUBJECTID",25)='21' OR SUBSTR("SUBJECTID",25)='23' OR
              SUBSTR("SUBJECTID",25)='24'))

15 rows selected.

SQL> explain plan for
  2  select * from tbl
  3  where SUBJECTID like 'GROUPFORCONTRACTSUBJECT\_%' escape '\' and substr(SUBJECTID,25) in ('21','23','24');

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------
Plan hash value: 688232147

-----------------------------------------------------------------------------
| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT |          |     1 |    28 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| TBL_IDX1 |     1 |    28 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------

   1 - access("SUBJECTID" LIKE 'GROUPFORCONTRACTSUBJECT\_%' ESCAPE '\')
       filter((SUBSTR("SUBJECTID",25)='21' OR
              SUBSTR("SUBJECTID",25)='23' OR SUBSTR("SUBJECTID",25)='24') AND
              "SUBJECTID" LIKE 'GROUPFORCONTRACTSUBJECT\_%' ESCAPE '\')

16 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39852082
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYDshedooЖелезный вариант:


Да ну?

Код: plsql
1.
SUBJECTID like 'GROUPFORCONTRACTSUBJECT\_%' escape '\' and substr(SUBJECTID,25) in ('21','23','24')



SY.

Это уже железо-бетонный вариант.

Мой вариант даже 'GROUPFORCONTRACTSUBJECT_21' от 'GROUPFORCONTRACTSUBJECT_21123123123' не отличит, конечно, он кривой.
Ещё как вариант по length() пробежаться.

А через регулярку можно что-то типа:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with q(SUB) as (select 'GROUPFORCONTRACTSUBJECT_21' from dual union all
select 'GROUPFORCONTRACTSUBJECT_23' from dual union all
select 'GROUPFORCONTRACTSUBJECT_213' from dual union all
select '_23GROUPFORCONTRACTSUBJECT_2' from dual union all
select '_21GROUPFORCONTRACTSUBJECT_2' from dual union all
select 'GROUPFORCONTRACTSUBJECT_235' from dual union all
select '1GROUPFORCONTRACTSUBJECT_23' from dual)

, w(id) as (select '23' from dual union all
select '21' from dual)

select q.*
 from q join w on regexp_substr(sub,'^GROUPFORCONTRACTSUBJECT_(\d+)',1,1,null,1) = w.id



И, если не путаю, индекс профитно использовать если вернуть надо <5-10% от фулла, иначе быстрее фулл.
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39852096
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooА через регулярку можно что-то типаПри указанном префиксе перечисление в in (...) лаконичнее, чем select ... from dual union all. И опять та же ошибка с суффиксом$.
Dshedooиндекс профитно использовать если вернуть надо <5-10% от фулла, иначе быстрее фулл.Индекс обычно меньше таблицы, так что iffs выгоднее tfs. Ну а дальше, сильно зависит от...
...
Рейтинг: 0 / 0
Помоготе упростить список значений в IN (наверное, регулярное выражение)
    #39852099
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooИ, если не путаю, индекс профитно использовать если вернуть надо <5-10% от фулла, иначе быстрее фулл.

И? Все эти "регулярки" лишают оптимизатор самой возможности (разве-что создать FBI) исользования индекса независимо от того что говорит статистика.

SY.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помоготе упростить список значений в IN (наверное, регулярное выражение)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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