powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Число хранится как текст. Как написать выборку с использованием between?
25 сообщений из 89, страница 2 из 4
Число хранится как текст. Как написать выборку с использованием between?
    #39537260
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicPL SQL НовичокЯ пока сделал так
Код: plsql
1.
WHERE    TO_NUMBER(RECEIPT) BETWEEN A1 AND A2


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

А если не секрет какие A1 и A2 в селекте?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537269
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,
Это переменные типа INTEGER, которые получают значения из входных параметров процедуры.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537278
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант поменять тип столбца путем add +update + drop + rename еще не предлагали?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537280
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadВариант поменять тип столбца путем add +update + drop + rename еще не предлагали?Нет, этого нельзя делать. Таковы условия задачи. Работать с той таблицей, которая есть.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537311
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком разе, остаётся только рассмотреть функциональный индекс , при необходимости...
Код: plsql
1.
2.
create index number_receipt
on my_table(to_number(receipt))
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537317
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viewer,
Понятно, спасибо.
Хотя сам вопрос звучал несколько иначе -
как правильно составить условие в запросе на выборку.
Я написал как
Код: plsql
1.
WHERE   TO_NUMBER(RECEIPT) between A1 and A2


Если есть какие-то возражения или улучшения, то прошу поделиться.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537322
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL Новичок,

Грубая ошибка может заключатся именно в сравнении символьных строк и чисел

от постановки зависит (от сути поля), не зря ж оно символьное

напр
для '10001' и '9000' between отработает по разному


зы
"чеки" могут быть напр 07077070, ведущий ноль важен

.....
stax
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537323
учи тель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

С обоими вариантами ты залезаешь в еще большую жопу.
'22' between '1' and '3' - не тот результат, что требуется.
Порядок вычисления предикатов определяется оптимизатором, regexp в таком виде не гарантирует отсутсвие ошибки. Тогда уж вставлял бы regexp, только substr, в качестве аргумента to_number.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537331
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsправославнее было бы явно конвертировать RECEIPT в число, предварительно проверив содержимое
Код: sql
1.
WHERE REGEXP_LIKE(RECEIPT, '^\d+$') and to_number(RECEIPT) between A1 and A2

Наивный, это не спасёт.
Код: plsql
1.
 regexp_substr(RECEIPT, '^\d+$') between …

...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537332
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL НовичокWHERE RECEIPT between A1 and A2;А какой практический смысл отбора номеров у чеков between?
PL SQL НовичокЯ бы никогда не стал хранить число как строку.А кто сказал что номер чека всегда число?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537349
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLА какой практический смысл отбора номеров у чеков between?
такова бизнес-логика 20874794
ORA__SQLА кто сказал что номер чека всегда число?
PL SQL Новичокя уже несколько раз повторял, что в этом поле всегда будут целые положительные числа. Сколько раз мне нужно написать эту фразу?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537360
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой-то лютый трэш начался ))
PL SQL Новичок, не трогай вообще поле таблицы, не модифицируй его.

все советы (и мой в том числе) сводятся к: приводи к типу поля таблицы свои переменные, а не наоборот.

а как ты это будешь делать: по заветам Элика или сам по себе, не велика в данном случае разница.
чтобы советы по "канону" давать, надо весь твой код видеть и структуру данных.
и то, этот "канон" вполне может стать неканоничным через 5 лет.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537372
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLА какой практический смысл отбора номеров у чеков between?Абсолютно никакого.
Но так надо.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537373
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLА кто сказал что номер чека всегда число?Мне что, землю есть вот из этого цветочного горшка, чтобы вы мне поверили? (c)
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537377
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelне трогай вообще поле таблицы, не модифицируй его.Да я бы с удовольствием его модифицировал, если бы такие привилегии имел в БД.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537378
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL НовичокORA__SQLА кто сказал что номер чека всегда число?Мне что, землю есть вот из этого цветочного горшка, чтобы вы мне поверили? (c)Сделать миграцию и отрефакторить не судьба?
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537398
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQL,
не понял вашу мысль. Что именно рефакторить и с какой целью?
Если замерить производительность запроса - то можно и на боевой БД.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537418
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLСделать миграцию и отрефакторить
может что-нибудь попроще чем:
data migration
перенос (миграция) данных 1) процесс физического перемещения данных из одной среды в другую - на другую аппаратную платформу или в другую , возможно с преобразованием форматов (см. data conversion)
refactoring
(от factor разлагать на множители, составляющие, вычленять) - перестройка [программного кода], перепроектирование , рефакторинг в программировании - переписывание исходных текстов с целью улучшения внутренней структуры программного кода при сохранении его интерфейсов и функциональности. Один из способов борьбы с программной энтропией (software entropy)
20875004 - и проверить можно и гарантировать на будущее...
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537445
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL Новичоксравнение должно проходить так, как если бы поле RECEIPT был бы INTEGER
Код: plsql
1.
where lpad(receipt,10) between lpad(a1,10) and lpad(a2,10)
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537446
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL SQL НовичокMaximaXXL,
Это переменные типа INTEGER, которые получают значения из входных параметров процедуры.

Если все кроме Вас оперируют varchar-ами для номеров чеков, то может случиться еще 2 неявных преобразования на входных параметрах, что тоже может сыграть не в Вашу пользу

операторы min и max - для поля RECEIPT - тоже могут привести к разным результатам при работе с Number и Varchar ...

Т.о. надо видеть постановку и реализацию, чтоб сказать, как Ваш ТимЛид, грубая ошибка или просто неявное преобразование которого лучше избегать
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537457
Да нуPL SQL Новичоксравнение должно проходить так, как если бы поле RECEIPT был бы INTEGER
Код: plsql
1.
where lpad(receipt,10) between lpad(a1,10) and lpad(a2,10)

Больший размер функционального индекса. В случае появления не integer вместо ошибки возможно неожиданное поведение.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537470
PL SQL Новичок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLоператоры min и max - для поля RECEIPT - тоже могут привести к разным результатам при работе с Number и VarcharЭто не операторы, а агрегатные функции. И для поля RECEIPT их никто не применяет.
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537493
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ну,

особенно если "номер" слева дополняется нулями

зы
не понимаю я таких заносчивых Тимлид-ов, раз сказал что ошибка, тем более грубая, что корона слетит, если обьяснит в чем грубость

......
stax
...
Рейтинг: 0 / 0
Число хранится как текст. Как написать выборку с использованием between?
    #39537519
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxне понимаю я таких заносчивых Тимлид-ов, раз сказал что ошибка, тем более грубая
А ведь ошибка.
И именно грубая.
ТС видит в данных строки, которые выглядят как целые числа, и уже на этом основании готов "землю есть" что это они самые.
Между тем речь идет об идентификаторах, а не о числах.
И семантика работы с ними, как уже справедливо отметили участники форума, не тождественна семантике работы с целыми.

Конкретно по указанному случаю - целые числа и их представления в виде строк в позиционной системе счисления ведут себя одинаково, если все строки одной длины (или сведены к ней lpad-ом). Возможно, именно эта похожесть и приводит к выводу о том, что "такая бизнес-логика".
Я бы рекомендовал ТС смирить гордыню, подойти к тимлиду и попросить детальных пояснений.

А на будущее можно дать рекомендацию, которая справедлива в большинстве случаев: тип данных в таблице - первичен.
По возможности избегайте применения функций вообще и преобразований типа в частности к полям таблицы в кляузе where - вместо этого преобразуйте параметры.
А также следите за типами и никогда не используйте неявных преобразований.
В справедливости рекомендации сможете неоднократно убедиться в процессе сопровождения и развития программного продукта.
Удачи.
...
Рейтинг: 0 / 0
25 сообщений из 89, страница 2 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Число хранится как текст. Как написать выборку с использованием between?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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