Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Проблема исспользования строковых ф-ций в 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]

Так ведь уже помогли...
Добавить в WHERE
strlen(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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
1-1090354133
Реактор
2004-07-21 00:08
2004.08.08
Как свернуть окно программы, если оно родило модальное окно.


1-1090568878
NJoe
2004-07-23 11:47
2004.08.08
TImage и рисование на канвасе


14-1090428956
Krug
2004-07-21 20:55
2004.08.08
Объясните новичку


1-1090573555
Serguar
2004-07-23 13:05
2004.08.08
полосы прокрутки при изменении стиля


14-1090400871
cherep
2004-07-21 13:07
2004.08.08
обратный -exe компилятор