Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизПроблема исспользования строковых ф-ций в SQL-запросе Найти похожие ветки
← →
LizaX © (2004-07-12 11:44) [0]Уважаемые мастера, помогите, пожалуйста, решить следующую проблему.
InterBase5.5. Имеется поле таблицы, тип данных - VARCHAR(150).
Нужно из строки выделить 8 последних знаков, и убрать последний.
Пример строки:
№дог.0096_Кооператив "Темп"_кафе_75365194_1605334_Применяю такой запрос:
SELECT networkitemid, substr(networkitemname, strlen(networkitemname)-7, strlen(networkitemname)-1)
from networkitem where networkitemname like "№%"
При выполнении в IB EXPERT выпадает сообщение:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
A fatal exception occurred during the execution of a user defined function.
arithmetic exception, numeric overflow, or string truncation.
и на выходе получаю 14 строк вместо 1958.
← →
Reindeer Moss Eater © (2004-07-12 11:47) [1]и на выходе получаю 14 строк вместо 1958.
То есть пока не встретил первую же запись, для которой аргументы для subst инфалидные.
← →
LizaX © (2004-07-12 11:55) [2]Получается, что так. Но исключать всех инвалидов из поиска не реально. Я не могу понять суть проблемы. Как ее победить? Возножно, причина в данных?
← →
Reindeer Moss Eater © (2004-07-12 11:57) [3]Я не могу понять суть проблемы
А попробуй.
представвь что есть поля где networkitemname is null
или поля where strlen(networkitemname) <= 7
← →
Соловьев © (2004-07-12 12:04) [4]
> №дог.0096_Кооператив "Темп"_кафе_75365194_1605334
какой ужас...нельзя было это нормальными сушностями представить?
← →
LizaX © (2004-07-12 12:05) [5]Таких строк нет. Я проверяла.
← →
Курдль © (2004-07-12 12:07) [6]Мне кажется, что в последнее время каждый автор вопросов норовит что-то скрыть... :(
LizaX © (12.07.04 11:44), не могли бы Вы пояснить, что за бизнес-процесс такой? Зачем столь замысловатая обработка строки?
← →
LizaX © (2004-07-12 12:07) [7]
> какой ужас...нельзя было это нормальными сушностями представить?
Если бы было по другому представлено, то я бы советов не просила.
← →
Reindeer Moss Eater © (2004-07-12 12:08) [8]и на выходе получаю 14 строк вместо 1958.
А что у нас в строке 15?
← →
Соловьев © (2004-07-12 12:08) [9]
> Таких строк нет. Я проверяла.
как?
← →
Соловьев © (2004-07-12 12:10) [10]
> Если бы было по другому представлено, то я бы советов не
> просила.
так сделайте - оградите себя от многих проблем.
← →
Johnmen © (2004-07-12 12:14) [11]>LizaX ©
Это правильно, что ты пришла сюда, не найдя ответа на
http://sql.ru/forum/actualthread.aspx?bid=2&tid=105869
:)
Но не хватает исходных данных.
В целом Reindeer Moss Eater © (12.07.04 11:57) [3]
← →
LizaX © (2004-07-12 12:15) [12]
> Зачем столь замысловатая обработка строки?
Так уж получилось (не моя вина), что строка №дог.0096_Кооператив "Темп"_кафе_75365194_1605334_
содержит в себе уникальный код из другой таблицы. Но именно из таблицы, которая ВАМ так не нравится необходимо выдрать данные, идентифицируя их именно по этому коду и потом обновить эти данные в другой таблице.
← →
LizaX © (2004-07-12 12:23) [13]
> А что у нас в строке 15?
В строке 15:
№дог.0073_Шовко-радгосп "Баришівський"_ТП 330 Технологічне відділення_6942233_1603973_
Данные очень корявые.
Ребята, прошу не смеяться и не улююкать. Что имеем то имеем. Если возможно - помогите.
← →
Соловьев © (2004-07-12 12:25) [14]предлагаю оформить этот запрос в виде ХП и дебагером пройтись, и точно выявить запись.
← →
Johnmen © (2004-07-12 12:26) [15]Так ведь уже помогли...
Добавить в WHEREstrlen(networkitemname)>7
← →
Deniz © (2004-07-12 12:27) [16]А это обязательно в select обрабатывать, или может на клиенте или в ХП?
← →
Курдль © (2004-07-12 12:27) [17]
> LizaX © (12.07.04 12:15) [12]
> > Зачем столь замысловатая обработка строки?
> Так уж получилось (не моя вина), что строка
Вариантов много.
1. Убейте того, кто создал такую структуру.
2. Увольтесь оттуда, где Вас заставляют делать ТАКОЕ.
3. Если все-таки работа одноразовая и Вам надо просто перелить данные из чьей-то тупой базы в свою супер-правильную, то создайте одноразовый проект, получите весь набор данных на клиента и там неспешно обработайте средствами Delphi, а не SQL.
← →
Соловьев © (2004-07-12 12:31) [18]
> strlen
а откуда ИДФ? самописная или FreeUDFLib?
← →
LizaX © (2004-07-12 12:34) [19]
> а откуда ИДФ? самописная или FreeUDFLib?
FreeUDFLib
← →
Reindeer Moss Eater © (2004-07-12 12:38) [20]Открыть исходник FreeUDFLib, внести логирование внутри этих функций.
← →
LizaX © (2004-07-12 12:40) [21]
> Так ведь уже помогли...
> Добавить в WHERE
> strlen(networkitemname)>7
Запрос
SELECT count(*)
from networkitem where networkitemname like "№%" and strlen(networkitemname) <= 7
Возвращает - 0.
← →
Reindeer Moss Eater © (2004-07-12 12:45) [22]А не языковый ли драйвер виноват, если валится на ""Баришівський"_ТП 330 Технологічне відділення...." ?
Он, кстати, какой вообще?
← →
Desdechado © (2004-07-12 12:48) [23]как описаны функции substr и strlen, откуда они взяты?
в какой-то из поставочных реализаций был баг в ней, очень похожий на твой
← →
Курдль © (2004-07-12 12:51) [24]
> LizaX © (12.07.04 12:23) [13]
> Ребята, прошу не смеяться и не улююкать. Что имеем то имеем.
> Если возможно - помогите.
Да никто не смеется - все Вам сочувствуют. Поэтому я еще раз прошу отнестись серьезно к моим словам.
Создайте нормальную БД, а не "..._1605334_
содержит в себе уникальный код из другой таблицы."
Перелейте туда данные из старой базы.
Обоснуйте и срубите с заказчика адекватную оплату.
Если Вам не хватает информации, чтобы убедить заказчика отказаться от этого бреда собачего - обращайтесь к нам!
← →
Johnmen © (2004-07-12 12:51) [25]substr(networkitemname, strlen(networkitemname)-7, 7)
и
where strlen(networkitemname)>7
← →
LizaX © (2004-07-12 12:52) [26]
> Он, кстати, какой вообще?
Pdox ANSI Cyrillic.
В предыдущих 14 строках тоже проскакивали украинские символы.
← →
Reindeer Moss Eater © (2004-07-12 12:53) [27]Тогда трассировка UDF поможет
← →
LizaX © (2004-07-12 16:23) [28]Получается такая картина.
В UDF - SUBSTR:
SET NAMES WIN1251;
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(80),
SMALLINT,
SMALLINT
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT "IB_UDF_substr" MODULE_NAME "ib_udf.dll";
В 15-й строке колличество символов - 87.
Теперь понятно откуда ноги растут.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.032 c