Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Число хранится как текст. Как написать выборку с использованием between? / 25 сообщений из 89, страница 1 из 4
17.10.2017, 07:52
    #39537181
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
Есть большая таблица MY_TABLE (строк порядка 120 млн.). Один из столбцов по имени RECEIPT хранит в поле числа (номер чека), но тип столбца VARCHAR2(15).
Создал процедуру, внутри которой идёт выборка данных из этой таблицы таким образом:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE PROCEDURE MY_PROCEDURE ( список_аргументов ) 
IS 

A1 INTEGER;
A2 INTEGER;

BEGIN

....


SELECT список_столбцов
INTO список_переменных
FROM MY_TABLE
WHERE RECEIPT between A1 and A2;

...

END;



Тимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в число (или быть может чисел A1 и A2 в строку!?).

Так ли это и как по вашему нужно писать данный селект?

P.S.
Проектировщик БД не я. Я бы никогда не стал хранить число как строку.
...
Рейтинг: 0 / 0
17.10.2017, 08:14
    #39537187
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL НовичокТимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в число (или быть может чисел A1 и A2 в строку!?).

Так ли это и как по вашему нужно писать данный селект?


Проверить то не сложно, чтоб не верить людям на слово

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (select 'a10' RECEIPT from dual)

select *
from t
where RECEIPT between 1 and 2

ORA-01722: invalid number





PL SQL НовичокP.S.
Проектировщик БД не я. Я бы никогда не стал хранить число как строку.

Я бы никогда - Выдыет опытного, матерого архитектора БД
...
Рейтинг: 0 / 0
17.10.2017, 08:15
    #39537188
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL НовичокТимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в числоГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие:
1) не может быть использован индекс;
2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать.
Это всё следствие быдлоархитектуры, но со вторым можно бороться.
...
Рейтинг: 0 / 0
17.10.2017, 08:20
    #39537190
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
если на поле RECEIPT индекс, лучше так:
Код: plsql
1.
2.
3.
4.
5.
6.
for i in A1 .. A2 loop
SELECT список_столбцов
INTO список_переменных
FROM MY_TABLE
WHERE RECEIPT = to_char(i);
end loop;
...
Рейтинг: 0 / 0
17.10.2017, 08:36
    #39537195
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
Fogelлучше так:Новичок, не смотри тот говнокод, он скрывает PL SQL Новичокгрубую ошибку:PL SQL Новичок
Код: plsql
1.
INTO список_переменных
...
Рейтинг: 0 / 0
17.10.2017, 08:51
    #39537201
Число хранится как текст. Как написать выборку с использованием between?
Fogelесли на поле RECEIPT
Я вдруг стал как все?
...
Рейтинг: 0 / 0
17.10.2017, 09:02
    #39537206
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
MaximaXXLORA-01722: invalid number
С этим проблем нет, там хранятся только валидные числа.
...
Рейтинг: 0 / 0
17.10.2017, 09:03
    #39537208
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
ElicГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие:
1) не может быть использован индекс;
2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать.
Это всё следствие быдлоархитектуры, но со вторым можно бороться.
Согласен с вами.
Но пункт 2 исключается, так как там только валидные числа.
Поэтому мой вопрос актуален - как бы вы написали этот селект?
...
Рейтинг: 0 / 0
17.10.2017, 09:14
    #39537212
jan2ary
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL НовичокНо пункт 2 исключается, так как там только валидные числа.Классика.
Что такое "валидньіе числа"? 4.5 - валидное число? А 4,5? А 1 500 455,15? А е^-1?
...
Рейтинг: 0 / 0
17.10.2017, 09:22
    #39537218
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL Новичоккак бы вы написали этот селект?Проблема не в самом запросе.
...
Рейтинг: 0 / 0
17.10.2017, 09:24
    #39537221
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
jan2ary,

Валидные целые положительные числа, записанные исключительно с использованием символов из множества
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

По существу вопроса будет что сказать?
...
Рейтинг: 0 / 0
17.10.2017, 09:28
    #39537226
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
ElicPL SQL Новичоккак бы вы написали этот селект?Проблема не в самом запросе.Согласен с вами. Мой тимлид считает, что проблема именно в моём селекте.
Он так и сказал: "грубая" ошибка!

Я сразу понял, что никакой "грубой" ошибки я не совершал, но спорить не стал - это у нас не поощряется.

Мне даже было рекомендовано ознакомиться с ссылкой
http://www.sqlbooks.ru/Articles03/sqloracle02_ru.htm
Но и там я не нашёл ничего, что свидетельствовало бы о "грубой" ошибке.
...
Рейтинг: 0 / 0
17.10.2017, 09:31
    #39537232
yabs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
ну можешь а1 и а2 в строку конвертировать, если тимлида это устроит
в случае целых числами вроде будет тот же результат
хотя думай сам, это уже посимвольное сравнение строк
Код: sql
1.
WHERE RECEIPT between to_char(A1) and to_char(A2)



православнее было бы явно конвертировать RECEIPT в число, предварительно проверив содержимое
Код: sql
1.
WHERE REGEXP_LIKE(RECEIPT, '^\d+$') and to_number(RECEIPT) between A1 and A2
...
Рейтинг: 0 / 0
17.10.2017, 09:33
    #39537234
jan2ary
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL Новичокjan2ary,

Валидные целые положительные числа, записанные исключительно с использованием символов из множества
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

По существу вопроса будет что сказать?Тогда обьявить А1 и А2 как varchar2 и дело в шляпе.
...
Рейтинг: 0 / 0
17.10.2017, 09:34
    #39537235
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL Новичоксчитает, что проблема именно в моём селекте.Сколько строк, как предполагается, возвращает запрос?
...
Рейтинг: 0 / 0
17.10.2017, 09:34
    #39537236
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
yabs,

Я пока сделал так

Код: plsql
1.
WHERE    TO_NUMBER(RECEIPT) BETWEEN A1 AND A2
...
Рейтинг: 0 / 0
17.10.2017, 09:35
    #39537237
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
ElicPL SQL Новичоксчитает, что проблема именно в моём селекте.Сколько строк, как предполагается, возвращает запрос?не более 10000
...
Рейтинг: 0 / 0
17.10.2017, 09:36
    #39537238
yabs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL НовичокМой тимлид считает, что проблема именно в моём селекте.
Он так и сказал: "грубая" ошибка!

и он прав
никто тебе не даст гарантию, что номера чеков не станут вдруг текстовыми
...
Рейтинг: 0 / 0
17.10.2017, 09:40
    #39537243
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
yabsникто тебе не даст гарантию, что номера чеков не станут вдруг текстовымия уже несколько раз повторял, что в этом поле всегда будут целые положительные числа. Сколько раз мне нужно написать эту фразу? Я уже понял, что архитектор погорячился, но один фиг, будут только числа.
...
Рейтинг: 0 / 0
17.10.2017, 09:41
    #39537246
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL Новичок,

Вы рассуждаете ... странно, то что Вы не знали в какую сторону идет преобразование - я порекомендовал проверить, и получил ответ "С этим проблем нет, там хранятся только валидные числа."

Вы спрашиваете как Вам решить вашу задачу ... а я ее пока не вижу ....
У чисел и строк разные подходы ...
Пример 1:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (select '10' RECEIPT from dual)

select *
from t
where to_number(RECEIPT) between 1 and 2

no data found



Пример 2:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as (select '10' RECEIPT from dual)

select *
from t
where RECEIPT between '1' and '2'


RECEIPT
10



Я например понятия не имею что Вас попросили найти/сравнить но строки и числа сравниваются по разному
...
Рейтинг: 0 / 0
17.10.2017, 09:43
    #39537247
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
MaximaXXLстроки и числа сравниваются по разномуя в курсе

MaximaXXLчто Вас попросили найти/сравнитьсравнение должно проходить так, как если бы поле RECEIPT был бы INTEGER
...
Рейтинг: 0 / 0
17.10.2017, 09:44
    #39537249
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL НовичокElicСколько строк, как предполагается, возвращает запрос?не более 10000RTFM too_many_rows
...
Рейтинг: 0 / 0
17.10.2017, 09:44
    #39537250
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
PL SQL НовичокЯ пока сделал так
Код: plsql
1.
WHERE    TO_NUMBER(RECEIPT) BETWEEN A1 AND A2

А оно именно так и работало.
...
Рейтинг: 0 / 0
17.10.2017, 09:47
    #39537253
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
Elic,
Сорри, я не так объяснил. Там только агрегатные функции, которые вычислены над подмножеством, состоящим из не более чем 10000 строк.
...
Рейтинг: 0 / 0
17.10.2017, 09:51
    #39537258
PL SQL Новичок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число хранится как текст. Как написать выборку с использованием between?
ElicPL SQL Новичокпропущено...
не более 10000RTFM too_many_rows
типа такого

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select 
    MAX(F1), 
    MIN(F1),
    MAX(F2),
    MIN(F2),
    COUNT(*)   
INTO
    X1,
    X2,
    X3
    X4,
    X5
FROM MY_TABLE
WHERE TO_NUMBER(RECEIPT) BETWEEN A1 AND A2
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Число хранится как текст. Как написать выборку с использованием between? / 25 сообщений из 89, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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