powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Число хранится как текст. Как написать выборку с использованием between?
25 сообщений из 89, страница 1 из 4
Число хранится как текст. Как написать выборку с использованием between?
    #39537181
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть большая таблица 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
Число хранится как текст. Как написать выборку с использованием between?
    #39537187
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Число хранится как текст. Как написать выборку с использованием between?
    #39537188
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL НовичокТимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в числоГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие:
1) не может быть использован индекс;
2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать.
Это всё следствие быдлоархитектуры, но со вторым можно бороться.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537190
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если на поле 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
Число хранится как текст. Как написать выборку с использованием between?
    #39537195
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelлучше так:Новичок, не смотри тот говнокод, он скрывает PL SQL Новичокгрубую ошибку:PL SQL Новичок
Код: plsql
1.
INTO список_переменных
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537201
Fogelесли на поле RECEIPT
Я вдруг стал как все?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537206
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLORA-01722: invalid number
С этим проблем нет, там хранятся только валидные числа.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537208
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие:
1) не может быть использован индекс;
2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать.
Это всё следствие быдлоархитектуры, но со вторым можно бороться.
Согласен с вами.
Но пункт 2 исключается, так как там только валидные числа.
Поэтому мой вопрос актуален - как бы вы написали этот селект?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537212
jan2ary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL НовичокНо пункт 2 исключается, так как там только валидные числа.Классика.
Что такое "валидньіе числа"? 4.5 - валидное число? А 4,5? А 1 500 455,15? А е^-1?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537218
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL Новичоккак бы вы написали этот селект?Проблема не в самом запросе.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537221
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jan2ary,

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

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

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

Мне даже было рекомендовано ознакомиться с ссылкой
http://www.sqlbooks.ru/Articles03/sqloracle02_ru.htm
Но и там я не нашёл ничего, что свидетельствовало бы о "грубой" ошибке.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537232
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну можешь а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
Число хранится как текст. Как написать выборку с использованием between?
    #39537234
jan2ary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL Новичокjan2ary,

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

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

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

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

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

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

А оно именно так и работало.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537253
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,
Сорри, я не так объяснил. Там только агрегатные функции, которые вычислены над подмножеством, состоящим из не более чем 10000 строк.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537258
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 89, страница 1 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Число хранится как текст. Как написать выборку с использованием between?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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