|
|
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Есть большая таблица 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. Тимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в число (или быть может чисел A1 и A2 в строку!?). Так ли это и как по вашему нужно писать данный селект? P.S. Проектировщик БД не я. Я бы никогда не стал хранить число как строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 07:52 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокТимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в число (или быть может чисел A1 и A2 в строку!?). Так ли это и как по вашему нужно писать данный селект? Проверить то не сложно, чтоб не верить людям на слово Код: plsql 1. 2. 3. 4. 5. 6. 7. PL SQL НовичокP.S. Проектировщик БД не я. Я бы никогда не стал хранить число как строку. Я бы никогда - Выдыет опытного, матерого архитектора БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:14 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокТимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в числоГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие: 1) не может быть использован индекс; 2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать. Это всё следствие быдлоархитектуры, но со вторым можно бороться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:15 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
если на поле RECEIPT индекс, лучше так: Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:20 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Fogelлучше так:Новичок, не смотри тот говнокод, он скрывает PL SQL Новичокгрубую ошибку:PL SQL Новичок Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:36 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Fogelесли на поле RECEIPT Я вдруг стал как все? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:51 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
MaximaXXLORA-01722: invalid number С этим проблем нет, там хранятся только валидные числа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:02 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие: 1) не может быть использован индекс; 2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать. Это всё следствие быдлоархитектуры, но со вторым можно бороться. Согласен с вами. Но пункт 2 исключается, так как там только валидные числа. Поэтому мой вопрос актуален - как бы вы написали этот селект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:03 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокНо пункт 2 исключается, так как там только валидные числа.Классика. Что такое "валидньіе числа"? 4.5 - валидное число? А 4,5? А 1 500 455,15? А е^-1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:14 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичоккак бы вы написали этот селект?Проблема не в самом запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:22 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
jan2ary, Валидные целые положительные числа, записанные исключительно с использованием символов из множества { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } По существу вопроса будет что сказать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:24 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicPL SQL Новичоккак бы вы написали этот селект?Проблема не в самом запросе.Согласен с вами. Мой тимлид считает, что проблема именно в моём селекте. Он так и сказал: "грубая" ошибка! Я сразу понял, что никакой "грубой" ошибки я не совершал, но спорить не стал - это у нас не поощряется. Мне даже было рекомендовано ознакомиться с ссылкой http://www.sqlbooks.ru/Articles03/sqloracle02_ru.htm Но и там я не нашёл ничего, что свидетельствовало бы о "грубой" ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:28 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ну можешь а1 и а2 в строку конвертировать, если тимлида это устроит в случае целых числами вроде будет тот же результат хотя думай сам, это уже посимвольное сравнение строк Код: sql 1. православнее было бы явно конвертировать RECEIPT в число, предварительно проверив содержимое Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:31 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичокjan2ary, Валидные целые положительные числа, записанные исключительно с использованием символов из множества { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } По существу вопроса будет что сказать?Тогда обьявить А1 и А2 как varchar2 и дело в шляпе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:33 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичоксчитает, что проблема именно в моём селекте.Сколько строк, как предполагается, возвращает запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:34 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
yabs, Я пока сделал так Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:34 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicPL SQL Новичоксчитает, что проблема именно в моём селекте.Сколько строк, как предполагается, возвращает запрос?не более 10000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:35 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокМой тимлид считает, что проблема именно в моём селекте. Он так и сказал: "грубая" ошибка! и он прав никто тебе не даст гарантию, что номера чеков не станут вдруг текстовыми ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:36 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
yabsникто тебе не даст гарантию, что номера чеков не станут вдруг текстовымия уже несколько раз повторял, что в этом поле всегда будут целые положительные числа. Сколько раз мне нужно написать эту фразу? Я уже понял, что архитектор погорячился, но один фиг, будут только числа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:40 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичок, Вы рассуждаете ... странно, то что Вы не знали в какую сторону идет преобразование - я порекомендовал проверить, и получил ответ "С этим проблем нет, там хранятся только валидные числа." Вы спрашиваете как Вам решить вашу задачу ... а я ее пока не вижу .... У чисел и строк разные подходы ... Пример 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. Пример 2: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Я например понятия не имею что Вас попросили найти/сравнить но строки и числа сравниваются по разному ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:41 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
MaximaXXLстроки и числа сравниваются по разномуя в курсе MaximaXXLчто Вас попросили найти/сравнитьсравнение должно проходить так, как если бы поле RECEIPT был бы INTEGER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:43 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокElicСколько строк, как предполагается, возвращает запрос?не более 10000RTFM too_many_rows ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:44 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокЯ пока сделал так Код: plsql 1. А оно именно так и работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:44 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Elic, Сорри, я не так объяснил. Там только агрегатные функции, которые вычислены над подмножеством, состоящим из не более чем 10000 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:47 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicPL SQL Новичокпропущено... не более 10000RTFM too_many_rows типа такого Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:51 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicPL SQL НовичокЯ пока сделал так Код: plsql 1. А оно именно так и работало.я так и думал с самого начала и гадал, где здесь "грубая" ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:52 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичок, А если не секрет какие A1 и A2 в селекте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:54 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, Это переменные типа INTEGER, которые получают значения из входных параметров процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:01 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Вариант поменять тип столбца путем add +update + drop + rename еще не предлагали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:09 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
AmKadВариант поменять тип столбца путем add +update + drop + rename еще не предлагали?Нет, этого нельзя делать. Таковы условия задачи. Работать с той таблицей, которая есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:13 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
В таком разе, остаётся только рассмотреть функциональный индекс , при необходимости... Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:35 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Viewer, Понятно, спасибо. Хотя сам вопрос звучал несколько иначе - как правильно составить условие в запросе на выборку. Я написал как Код: plsql 1. Если есть какие-то возражения или улучшения, то прошу поделиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:41 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичок, Грубая ошибка может заключатся именно в сравнении символьных строк и чисел от постановки зависит (от сути поля), не зря ж оно символьное напр для '10001' и '9000' between отработает по разному зы "чеки" могут быть напр 07077070, ведущий ноль важен ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:46 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
yabsну можешь а1 и а2 в строку конвертировать, если тимлида это устроит в случае целых числами вроде будет тот же результат хотя думай сам, это уже посимвольное сравнение строк Код: sql 1. православнее было бы явно конвертировать RECEIPT в число, предварительно проверив содержимое Код: sql 1. С обоими вариантами ты залезаешь в еще большую жопу. '22' between '1' and '3' - не тот результат, что требуется. Порядок вычисления предикатов определяется оптимизатором, regexp в таком виде не гарантирует отсутсвие ошибки. Тогда уж вставлял бы regexp, только substr, в качестве аргумента to_number. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:46 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
yabsправославнее было бы явно конвертировать RECEIPT в число, предварительно проверив содержимое Код: sql 1. Наивный, это не спасёт. Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:52 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокWHERE RECEIPT between A1 and A2;А какой практический смысл отбора номеров у чеков between? PL SQL НовичокЯ бы никогда не стал хранить число как строку.А кто сказал что номер чека всегда число? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:57 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ORA__SQLА какой практический смысл отбора номеров у чеков between? такова бизнес-логика 20874794 ORA__SQLА кто сказал что номер чека всегда число? PL SQL Новичокя уже несколько раз повторял, что в этом поле всегда будут целые положительные числа. Сколько раз мне нужно написать эту фразу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:13 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
какой-то лютый трэш начался )) PL SQL Новичок, не трогай вообще поле таблицы, не модифицируй его. все советы (и мой в том числе) сводятся к: приводи к типу поля таблицы свои переменные, а не наоборот. а как ты это будешь делать: по заветам Элика или сам по себе, не велика в данном случае разница. чтобы советы по "канону" давать, надо весь твой код видеть и структуру данных. и то, этот "канон" вполне может стать неканоничным через 5 лет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:24 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ORA__SQLА какой практический смысл отбора номеров у чеков between?Абсолютно никакого. Но так надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:34 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ORA__SQLА кто сказал что номер чека всегда число?Мне что, землю есть вот из этого цветочного горшка, чтобы вы мне поверили? (c) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:35 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Fogelне трогай вообще поле таблицы, не модифицируй его.Да я бы с удовольствием его модифицировал, если бы такие привилегии имел в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:38 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокORA__SQLА кто сказал что номер чека всегда число?Мне что, землю есть вот из этого цветочного горшка, чтобы вы мне поверили? (c)Сделать миграцию и отрефакторить не судьба? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:38 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ORA__SQL, не понял вашу мысль. Что именно рефакторить и с какой целью? Если замерить производительность запроса - то можно и на боевой БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:50 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ORA__SQLСделать миграцию и отрефакторить может что-нибудь попроще чем: data migration перенос (миграция) данных 1) процесс физического перемещения данных из одной среды в другую - на другую аппаратную платформу или в другую , возможно с преобразованием форматов (см. data conversion) refactoring (от factor разлагать на множители, составляющие, вычленять) - перестройка [программного кода], перепроектирование , рефакторинг в программировании - переписывание исходных текстов с целью улучшения внутренней структуры программного кода при сохранении его интерфейсов и функциональности. Один из способов борьбы с программной энтропией (software entropy) 20875004 - и проверить можно и гарантировать на будущее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 12:00 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичоксравнение должно проходить так, как если бы поле RECEIPT был бы INTEGER Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 12:47 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокMaximaXXL, Это переменные типа INTEGER, которые получают значения из входных параметров процедуры. Если все кроме Вас оперируют varchar-ами для номеров чеков, то может случиться еще 2 неявных преобразования на входных параметрах, что тоже может сыграть не в Вашу пользу операторы min и max - для поля RECEIPT - тоже могут привести к разным результатам при работе с Number и Varchar ... Т.о. надо видеть постановку и реализацию, чтоб сказать, как Ваш ТимЛид, грубая ошибка или просто неявное преобразование которого лучше избегать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 12:47 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Да нуPL SQL Новичоксравнение должно проходить так, как если бы поле RECEIPT был бы INTEGER Код: plsql 1. Больший размер функционального индекса. В случае появления не integer вместо ошибки возможно неожиданное поведение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 13:07 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
MaximaXXLоператоры min и max - для поля RECEIPT - тоже могут привести к разным результатам при работе с Number и VarcharЭто не операторы, а агрегатные функции. И для поля RECEIPT их никто не применяет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 13:34 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Да ну, особенно если "номер" слева дополняется нулями зы не понимаю я таких заносчивых Тимлид-ов, раз сказал что ошибка, тем более грубая, что корона слетит, если обьяснит в чем грубость ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 14:07 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Staxне понимаю я таких заносчивых Тимлид-ов, раз сказал что ошибка, тем более грубая А ведь ошибка. И именно грубая. ТС видит в данных строки, которые выглядят как целые числа, и уже на этом основании готов "землю есть" что это они самые. Между тем речь идет об идентификаторах, а не о числах. И семантика работы с ними, как уже справедливо отметили участники форума, не тождественна семантике работы с целыми. Конкретно по указанному случаю - целые числа и их представления в виде строк в позиционной системе счисления ведут себя одинаково, если все строки одной длины (или сведены к ней lpad-ом). Возможно, именно эта похожесть и приводит к выводу о том, что "такая бизнес-логика". Я бы рекомендовал ТС смирить гордыню, подойти к тимлиду и попросить детальных пояснений. А на будущее можно дать рекомендацию, которая справедлива в большинстве случаев: тип данных в таблице - первичен. По возможности избегайте применения функций вообще и преобразований типа в частности к полям таблицы в кляузе where - вместо этого преобразуйте параметры. А также следите за типами и никогда не используйте неявных преобразований. В справедливости рекомендации сможете неоднократно убедиться в процессе сопровождения и развития программного продукта. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 14:41 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Staxраз сказал что ошибка, тем более грубая, что корона слетит, если обьяснит в чем грубость andrey_anonymousподойти к тимлиду и попросить детальных пояснений. И он таки пояснил. Сказал, что неявное преобразование данных приводит к неоправданному повышению нагрузки на сервер БД и кинул мне ссылку "на почитать" (см. выше). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 14:58 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Народ, на будущее - в столбце RECEIPT хранятся только строки, составленные из символов: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' Никаких других символов там нет, не было и не будет. Прошу рассматривать эту задачу именно в рамках этих условий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:01 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичокнеявное преобразование данных приводит к неоправданному повышению нагрузки на сервер БДНеявное преобразование не дороже явного. Он неадекват. Экономит на спичках, когда дом горит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:09 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicНеявное преобразование не дороже явного.Спасибо, именно это я также хотел уточнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:21 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
То что автор видит там только числа, не говорит о том, что в дальнейшем это не станет действительно строками. Не знаю, что там в голове у архитектора, но, возможно, закладывались на применение каких-нибудь префиксов или постфиксов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:22 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
IMHO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:22 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Что за тимлид такой, что сам и сразу не поясняет своих мыслей? И почему бы сразу у него не попросить пояснений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:29 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
K790автор видит там только числа, не говорит о том, что в дальнейшем это не станет действительно строкамину вот опять ... но даже если вдруг там появятся "нечисловые" строки (а этого не может быть, иначе нарушится бизнес-логика), то у меня на этот случай предусмотрен блок Exception, и в этом случае процедура выдаст return_code > 0, что соответствует ошибке. Успокойтесь уже с этими "нечисловыми" строками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:29 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicОн неадекват. Экономит на спичках, когда дом горит.+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:29 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичокно даже если вдруг там появятся "нечисловые" строкикакого хрена тогда хранить числа как строки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:30 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderЧто за тимлид такой, что сам и сразу не поясняет своих мыслей? И почему бы сразу у него не попросить пояснений?Ну я и спросил, почти что сразу и получил пояснения, которые, однако, меня не удовлетворили, что и побудило меня обратиться на форум профессионалов-ораклоидов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:31 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderкакого хрена тогда хранить числа как строки?Это вопрос к архитектору БД. Я тоже вот этим обстоятельством как раз недоволен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:32 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL НовичокStaxраз сказал что ошибка, тем более грубая, что корона слетит, если обьяснит в чем грубость andrey_anonymousподойти к тимлиду и попросить детальных пояснений. И он таки пояснил. Сказал, что неявное преобразование данных приводит к неоправданному повышению нагрузки на сервер БД и кинул мне ссылку "на почитать" (см. выше). Повышение нагрузки потенциально возможно при наличии индекса по полю RECEIPT, и тут уже важно как ети цифирки хранятся в поле, выровненные по правому/левому полю, дополненные нулями, как null хранится (встречал что как пробел) и тд ps імхо, надо приставать к лидеру, пусть расказывает, или дает права ... ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:33 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousА на будущее можно дать рекомендацию, которая справедлива в большинстве случаев: тип данных в таблице - первичен. По возможности избегайте применения функций вообще и преобразований типа в частности к полям таблицы в кляузе where - вместо этого преобразуйте параметры. Иногда так архитекторы настроят, что без преобразования тяжеловато напр числовые коды в строке выровненные влево ('10','7','72','3','100') и выбрать из диапазона с по ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:38 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderкакого хрена тогда хранить числа как строки? Никто не говорил, что там именно числа. Так считает топикстартер. У вас например БИК банка (это всегда цифры и только цифры) - это число или строка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:42 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
j2kБИК банка (это всегда цифры и только цифры)Зарекаться от IBAN, как минимум, неразумно. А пока рекомендую строку с check-ом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:48 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderPL SQL Новичокно даже если вдруг там появятся "нечисловые" строкикакого хрена тогда хранить числа как строки? Саян, не строки это. Идентификаторы. ИМХО ТС несколько горяч - это пройдет с опытом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:50 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
j2kНикто не говорил, что там именно числа там именно числа. Такова постановка задачи, а вовсе не потому, что я так посчитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 15:50 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Staxandrey_anonymousА на будущее можно дать рекомендацию, которая справедлива в большинстве случаев: тип данных в таблице - первичен. По возможности избегайте применения функций вообще и преобразований типа в частности к полям таблицы в кляузе where - вместо этого преобразуйте параметры. Иногда так архитекторы настроят, что без преобразования тяжеловато напр числовые коды в строке выровненные влево ('10','7','72','3','100') и выбрать из диапазона с по В телекоме коды ABC/DEF именно таковы. Я на них в свое время "собаку съел", решая задачу эффективной привязки зоны к номеру по наиболее полному соответствию. Виталий, кстати, подсказал одно из весьма эффективных решений - для одиночных поисков (для массовых операций есть способы более эффективные, хотя и довольно сложные технически). Но к преобразованию цифровых кодов в числа для решения задач поиска не прибегал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 16:00 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderPL SQL Новичокно даже если вдруг там появятся "нечисловые" строкикакого хрена тогда хранить числа как строки?Может архитектор задумывал как внешний номер. Может его пишут от руки на салфетке и не всегда можно разобрать, где рыбу заворачивали. Я бы в таком случае заложил блоб для хранения картинки идентификатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 18:18 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Архе те, кто р...xtenderпропущено... какого хрена тогда хранить числа как строки?Может архитектор задумывал как внешний номер. Может его пишут от руки на салфетке и не всегда можно разобрать, где рыбу заворачивали. Я бы в таком случае заложил блоб для хранения картинки идентификатора. картинки мало - нужно видео не менее 30 минут с размышлениями создателя, почему именно такой идентификатор был выбран для данного случая. я так и не понял, почему до сих пор не выяснили, А1 и А2 - это числа или нет? ))) и мы так и не услышали мнение начальника транспортного цеха сурового тимлида, бьющего линейкой по пальцам за "грубые" ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 18:23 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
PL SQL Новичок, Нормальная практика. В больших, масштабируемых системах всегда закладываются на возможность изменения бизнес правил. Число это - часный случай строки. Архитектор запроектировал, а какие данные туда упали числа или строки ему не известно. А если кто-то по строкам делает "between", то кто ему доктор :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 03:52 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousВ телекоме коды ABC/DEF именно таковы. Я на них в свое время "собаку съел", решая задачу эффективной привязки зоны к номеру по наиболее полному соответствию.кстати, да, очень интересная и полезная задачка. Я уже тут видел похожие топики и даже что-то решал, но сейчас что-то не осилил поиском найти твои... Может отдельный топик создашь про нее со своими решениями? Туда и другие варианты накидаем :) я тут минут 10 подумал и такое наваял: исходные таблички Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. мое решение Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 04:52 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
еще немного подумав, понял что для коротких префиксов оптимальнее будет так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 05:28 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderно сейчас что-то не осилил поиском найти твоиElicSTFF Как можно выбрать максимум подходящую строку из таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 07:36 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Elic, Ага, спасибо, отличное решение, помню его и про NLS-зависимость. В моих тестах при binary и практическом отсутствии повторов на миллионе, оно самое быстрое: 1. Elapsed: 00:00:35.62 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 2. Elapsed: 00:00:11.29 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. Elic. Elapsed: 00:00:09.67 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. PS. Генератор в моем первом решении съедает практически все время... Модератор: Вложение удалено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 09:29 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
Fogel я так и не понял, почему до сих пор не выяснили, А1 и А2 - это числа или нет? ))) Код: plsql 1. 2. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 09:34 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtender Код: plsql 1. 2. Саян, я на Verification Code собаку съел. Cleanup располагается в конце скрипта, чтобы вернуть всё к состоянию, как будто его (скрипта) здесь не было. Просьба учесть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 10:39 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
StaxFogelя так и не понял, почему до сих пор не выяснили, А1 и А2 - это числа или нет? ))) Код: plsql 1. 2. ..... stax Stax, это был стёб по наблюдению обсуждения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 11:53 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderandrey_anonymousВ телекоме коды ABC/DEF именно таковы. Я на них в свое время "собаку съел", решая задачу эффективной привязки зоны к номеру по наиболее полному соответствию.кстати, да, очень интересная и полезная задачка. Я уже тут видел похожие топики и даже что-то решал, но сейчас что-то не осилил поиском найти твои... Может отдельный топик создашь про нее со своими решениями? Туда и другие варианты накидаем :) Я уже в другой области работаю, искать исходники лень. Решение Виталия - очень эффективно для одиночных поисков. Для _массовой привязки (десятки-сотни миллионов звонков) я либо преобразовывал входящую таблицу префиксов (чуть-чуть более толстую, чем в примерах и с учетом истории изменений , что вообще никто не показывает на форумах :) ) для привязки по равенству, либо - через похожее преобразование, но без нормализации длины префикса загонял в индексированную pl/sql таблицу и привязку делал в pipelined (через .prior()) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 15:47 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtender, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Функция phone_pkg.get_code взята у меня из книги. When PL/SQL is better than vanilla SQL (стр 133) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 00:36 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Я попытался сделать как у меня, т.е. чтобы можно было приджойнить поля из PREFIXES. Но как-то долго вышло... Я что-то сделал не так? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 01:07 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtender, От соединения надо уходить, descr можно засунуть в ассоциативный массив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 01:11 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, добавил в твой пакет еще функцию с возвратом max_length, чтобы уменшить кол-во вызова за счет кэширования deterministic и получилось дико быстро ~ 3.5 сек: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 01:12 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopxtender, От соединения надо уходить, descr можно засунуть в ассоциативный массив.просто как-то неожиданно долго стало, хотя там был HJ: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 01:14 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
А вообще по теме кэширования: да, там действительно дикий оверхэд у result_cache - у меня всегда получалось, что ручной кэш в пакетных переменных намного быстрее. В ПСБ когда у меня была проблема еще и с непонятной инвалидацией, я даже сделал замороченный пакет в котором использовал и result_cache, и пакетные переменные: 1) была простая функция с result_cache чисто для инвалидации/сброса пакетных переменных 2) сами кэшируемые данные были в пакетных переменных, при инвалидации result_cache, вызывалась функция пересбора кэша ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 01:19 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
ElicPL SQL НовичокТимлид сказал, что в этом селекте я допустил грубую ошибку, так как здесь идёт неявное преобразование строки в числоГрубую ошибку сделал архитектор. Само по себе неявное преобразование не так страшно. Но в данном случае RECEIPT преобразуется к числу и как следствие: 1) не может быть использован индекс; 2) если где-то в RECEIPT есть нечисло, то запрос всегда будет падать. Это всё следствие быдлоархитектуры, но со вторым можно бороться. Не факт что архитектор сделал грубую ошибку. Возможно это сознательное решение, связанное с особенностями генерации номера чека, призванное предотвратить обработку номеров как чисел. Например, он хотел этим сказать следующее: если вам нужно выбрать чеки выданные между двумя другими то даже не думайте искать по соответствию номеров. Ищите только по дате выдачи чека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 11:21 |
|
||
|
Число хранится как текст. Как написать выборку с использованием between?
|
|||
|---|---|---|---|
|
#18+
xtenderА вообще по теме кэширования: да, там действительно дикий оверхэд у result_cache - у меня всегда получалось, что ручной кэш в пакетных переменных намного быстрее. Это до тех пор, пока данные в uga помещаются, дальше сложнее. Я когда-то из спортивного интереса даже реализовал алгоритм ARC на PL/SQL, но невозможность отделить сам алгоритм от данных делает идею нерентабельной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 11:23 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1885079]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 368ms |

| 0 / 0 |
