Вниз
Скачать: CL | DM;

Oracle, математический финт (с индексом) есть какой-нибудь?   Найти похожие ветки 

← →
AV ©   (2012-04-02 11:14) [0]

table - T
cod - number
индекс BTree по cod

запрос
...
and to_char(cod) like "80%"

не использует индекс. Заводить индекс по функции не хотелось бы.

А нельзя ли как-нибудь
and cod = какие-нибудь_вычисления_которые_дадут_числа_с_80
т.е. (80, 801, 8000552, 804 подходят)
?


← →
Дмитрий С ©   (2012-04-02 11:22) [1]

Предположим есть такая функция F, которая тебе нужна. Покажи, пожалуйста, как ты собираешься ее применить?


← →
Медвежонок Пятачок ©   (2012-04-02 11:42) [2]

я бы копал в сторону bitand


← →
Медвежонок Пятачок ©   (2012-04-02 11:46) [3]

но индекс тоже скорее пойдет лесом.
тогда (изврат) функция-рефкурсор, в котором все (!) нужные числа.

и where cod in (....)

а вообще - сильно задуматься над типом cod, почему он нумбер, а не варчар, если уж его необходимо так использовать


← →
Sha ©   (2012-04-02 11:47) [4]

что мешает перечислить все возможные диапазоны


← →
Дмитрий С ©   (2012-04-02 11:57) [5]


> Sha ©   (02.04.12 11:47) [4]

code BETWEEN 80 AND 89
AND code BETWEEN 800 AND 899
AND code BETWEEN 8000 AND 8999
AND ...
так?


← →
Кщд   (2012-04-02 11:59) [6]

>Дмитрий С ©   (02.04.12 11:22) [1]
>Покажи, пожалуйста, как ты собираешься ее применить?
он показал: and cod = какие-нибудь_вычисления_которые_дадут_числа_с_80
что смущает?

>AV ©   (02.04.12 11:14)
целиком поддерживаю Медвежонок Пятачок ©   (02.04.12 11:46) [3]
почему нельзя просто сменить тип?
если это невозможно по реалистичным причинам, то отчего "Заводить индекс по функции не хотелось бы"?


← →
RWolf ©   (2012-04-02 12:02) [7]

дополнительное индексированное поле VARCHAR(2) с первыми двумя символами поля COD, не?


← →
Дмитрий С ©   (2012-04-02 12:03) [8]


> Дмитрий С ©   (02.04.12 11:57) [5]

OR то есть.


> он показал: and cod = какие-нибудь_вычисления_которые_дадут_числа_с_80
> что смущает?

Нуу. Смущает знак равенства например.


← →
Кщд   (2012-04-02 12:07) [9]

>Дмитрий С ©   (02.04.12 12:03) [8]
чем?)


← →
Дмитрий С ©   (2012-04-02 12:09) [10]

Хотя можно и со знаком равенства
and cod = IF(cod div power(10,  ceil(ln(cod)/ln(10)) - 2),cod,-1)
(это в качестве идеи, синтаксис и правильность под сомнением)


← →
Дмитрий С ©   (2012-04-02 12:10) [11]

в IF-е забыл в условии написать =80


← →
Кщд   (2012-04-02 12:24) [12]

>Дмитрий С ©   (02.04.12 12:09) [10]
>cod = IF(cod div power(10,  ceil(ln(cod)/ln(10)) - 2),cod,-1)
индекс в этом случае использоваться не будет


← →
Дмитрий С ©   (2012-04-02 12:25) [13]


> Кщд   (02.04.12 12:24) [12]

Я знаю. Это шутка. При условии
and cod = какие-нибудь_вычисления_которые_дадут_числа_с_80
индекс в любом случае использоваться не будет.


← →
Кщд   (2012-04-02 12:30) [14]

>Дмитрий С ©   (02.04.12 12:25) [13]
>индекс в любом случае использоваться не будет.
почему?((


← →
Дмитрий С ©   (2012-04-02 12:33) [15]


> Кщд   (02.04.12 12:30) [14]

А можно пример при котором будет, хотя бы абстрактный?


← →
Кщд   (2012-04-02 12:36) [16]

>Дмитрий С ©   (02.04.12 12:33) [15]
from T t
where t.cod = f(C)
где f - любая deterministic-ф-ция и C - константа.


← →
oldman ©   (2012-04-02 13:10) [17]

where copy(inttostr(cod), 1, 2)="80"
:)


← →
Дмитрий С ©   (2012-04-02 13:14) [18]


> Кщд   (02.04.12 12:36) [16]

Предположим есть таблица:

cod
798
799
800
801
802

Что должна вернуть функция f(c), чтобы выбрать все записи строковое представление поля cod которых начинается на "80"?


← →
AV ©   (2012-04-02 13:45) [19]

ясно,
почему индекс не хотелось бы - потому что не хозяин, просить надо
хотелось бы как-нибудь с финтом, подумалось, что пусть вычислит до нумбера и может как-нибудь прокатит

ну а раз нет, то нет. Просить буду индекс
спасибо


← →
Игорь Шевченко ©   (2012-04-02 13:59) [20]

CASE WHEN TRANSLATE (...) IS NULL THEN TO_NUMBER(...) ELSE если не странслировалось END


← →
Кщд   (2012-04-02 14:29) [21]

>Дмитрий С ©   (02.04.12 13:14) [18]
речь шла о том, что если бы такая ф-ция была, то было бы чтение по индексу

как по-Вашему, отчего при записи:
cod = IF(cod div power(10,  ceil(ln(cod)/ln(10)) - 2),cod,-1)
индекс бы не использовался?


← →
Дмитрий С ©   (2012-04-02 14:32) [22]


> речь шла о том, что если бы такая ф-ция была, то было бы
> чтение по индексу

Это понятно, но она в принципе существовать такая не может.


← →
Владислав ©   (2012-04-02 14:58) [23]

CREATE TABLE t (
 code NUMBER
   CONSTRAINT pk_t PRIMARY KEY
);

INSERT INTO t(code) VALUES(70);
INSERT INTO t(code) VALUES(80);
INSERT INTO t(code) VALUES(85);
INSERT INTO t(code) VALUES(89);
INSERT INTO t(code) VALUES(90);
INSERT INTO t(code) VALUES(700);
INSERT INTO t(code) VALUES(800);
INSERT INTO t(code) VALUES(850);
INSERT INTO t(code) VALUES(899);
INSERT INTO t(code) VALUES(900);
INSERT INTO t(code) VALUES(7000);
INSERT INTO t(code) VALUES(8000);
INSERT INTO t(code) VALUES(8500);
INSERT INTO t(code) VALUES(8999);
INSERT INTO t(code) VALUES(9000);
INSERT INTO t(code) VALUES(9999);

COMMIT;

WITH
 max_code AS (
   SELECT MAX(code) max_code FROM t),
 max_power AS (
   SELECT TRUNC(LOG(10, max_code)) max_power FROM max_code),
 powers AS (
   SELECT LEVEL - 1 powers
     FROM max_power
   CONNECT BY LEVEL <= max_power),
 ranges AS (
   SELECT 80 * POWER(10, powers) from_value,
     90 * POWER(10, powers) to_value
     FROM powers)
SELECT t.code, r.from_value, r.to_value
 FROM t, ranges r
WHERE t.code >= r.from_value AND t.code < r.to_value
;


← →
Кщд   (2012-04-02 15:24) [24]

>Владислав ©   (02.04.12 14:58) [23]
условия задачи читали?


← →
Владислав ©   (2012-04-02 15:28) [25]


> Кщд   (02.04.12 15:24) [24]


Заставить использовать индекс? Читал.


← →
ZeroDivide ©   (2012-04-02 15:33) [26]


> Заводить индекс по функции не хотелось бы.


Почему?


← →
Кщд   (2012-04-02 15:49) [27]

>Владислав ©   (02.04.12 15:28) [25]
задача в том, чтобы ехать, а не шашечки
Ваш запрос не эквивалентен: and to_char(cod) like "80%"
рабочий вариант здесь один: FBI


← →
Владислав ©   (2012-04-02 16:15) [28]


> Кщд   (02.04.12 15:49) [27]


Думаю, автору позволит религия довести подсказку до рабочего состояния.

WITH
 value AS (
   SELECT TO_NUMBER("80") value FROM dual
 ),
 decoded_value AS (
   SELECT DECODE(value, 0, NULL, value) decoded_value FROM value
 ),
 max_code AS (
   SELECT MAX(code) max_code FROM t
 ),
 max_power AS (
   SELECT TRUNC(LOG(10, max_code)) max_power FROM max_code
 ),
 powers AS (
   SELECT LEVEL - 1 powers
     FROM max_power
   CONNECT BY LEVEL <= max_power + 3
 ),
 ranges AS (
   SELECT decoded_value * POWER(10, powers) from_value,
     (decoded_value + 1) * POWER(10, powers) to_value
     FROM powers, decoded_value
 )
SELECT t.code, r.from_value, r.to_value
 FROM t, ranges r
WHERE t.code >= r.from_value AND t.code <= r.to_value
;


← →
Кщд   (2012-04-03 07:21) [29]

>Владислав ©   (02.04.12 16:15) [28]
ага, отлично)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.05 c
2-1344328033
Pcrepair
2012-08-07 12:27
2013.03.22
Чем лучше заменить TidHTTP Indy 10?


15-1329926834
Unknown user
2012-02-22 20:07
2013.03.22
Balloon hint


15-1344500626
Прогер
2012-08-09 12:23
2013.03.22
XML в Дельфи 7.


2-1330533371
lcd1232
2012-02-29 20:36
2013.03.22
Работа с post/get запросами


15-1341400402
Inovet
2012-07-04 15:13
2013.03.22
Нашли бозон Хигса (?)




   Наверх