Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: 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 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.053 c
15-1343378205
Phoenix_
2012-07-27 12:36
2013.03.22
Delphi -> Java/Android


1-1298124684
Wadimka
2011-02-19 17:11
2013.03.22
Наложение Bitmap


15-1328599963
igorserg
2012-02-07 11:32
2013.03.22
XMLDocument - косяк при изменении порядка следования тегов.


2-1339398926
Handler
2012-06-11 11:15
2013.03.22
сравнение строк


2-1331645587
Сергей
2012-03-13 17:33
2013.03.22
Компонент Delphi для Clob Oracle?