Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.069 c
15-1336681802
Юрий
2012-05-11 00:30
2013.03.22
С днем рождения ! 11 мая 2012 пятница


15-1342015306
Дмитрий С
2012-07-11 18:01
2013.03.22
Apache mod_rewrite


15-1341413403
Artem
2012-07-04 18:50
2013.03.22
mail.ru у вас открывается?


1-1275549451
ford
2010-06-03 11:17
2013.03.22
чтение текстовых данных из двоичных файлов (PDF)


2-1328430400
FIL-23
2012-02-05 12:26
2013.03.22
переменная типа memo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский