Форум: "Прочее";
Текущий архив: 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