Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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]

Так ведь уже помогли...
Добавить в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.032 c
3-1089804219
Shama_n
2004-07-14 15:23
2004.08.08
Как на SQL записать код символа вместо его явного указания?


14-1090254978
DeadMeat
2004-07-19 20:36
2004.08.08
Нарды


14-1090231860
Некрофил-затейник__
2004-07-19 14:11
2004.08.08
Девушки и инопланетяне против модератора!


1-1090658388
ИМХО
2004-07-24 12:39
2004.08.08
Немного о TTimer е


3-1089799666
vic1
2004-07-14 14:07
2004.08.08
Подключение к MSSQL2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский