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


можно ли GROUPFORCONTRACTSUBJECT_21 заменить маской, а в условие добавить только цифры?
...
Рейтинг: 0 / 0
20.08.2019, 17:02
    #39851773
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
...
Рейтинг: 0 / 0
20.08.2019, 17:10
    #39851779
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
Железный вариант:
Код: 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
20.08.2019, 17:49
    #39851795
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
mkr15 однотипных значений Не так много, чтобы пережевывать на форуме. На другой чаше весов выражение от поля может: исключить доступ по индексу, фильтр сторейджа, менее точная оценка кардиналити, усложнение последующего изменения условия под нетипичные значения.
...
Рейтинг: 0 / 0
21.08.2019, 08:27
    #39851908
Сергей из Самары
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
mkr,

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

Тебе ещё совсем рано советовать.
...
Рейтинг: 0 / 0
21.08.2019, 12:29
    #39852055
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
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
21.08.2019, 13:06
    #39852082
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
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
21.08.2019, 13:21
    #39852096
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
DshedooА через регулярку можно что-то типаПри указанном префиксе перечисление в in (...) лаконичнее, чем select ... from dual union all. И опять та же ошибка с суффиксом$.
Dshedooиндекс профитно использовать если вернуть надо <5-10% от фулла, иначе быстрее фулл.Индекс обычно меньше таблицы, так что iffs выгоднее tfs. Ну а дальше, сильно зависит от...
...
Рейтинг: 0 / 0
21.08.2019, 13:29
    #39852099
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоготе упростить список значений в IN (наверное, регулярное выражение)
DshedooИ, если не путаю, индекс профитно использовать если вернуть надо <5-10% от фулла, иначе быстрее фулл.

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

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


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