SQL0802 - неверные числовые данные - PullRequest
0 голосов
/ 04 мая 2019

Я нахожусь в базе данных db2 по системе as400.У меня есть запрос на выборку, который выдает ошибку в заголовке: код SQL0802, который является «недопустимыми числовыми данными» (переведено).

Я попытался разделить запрос на разные части и тестировать каждую часть одну за другой.чтобы убедиться, что это работает, я на 99% убежден, что проблема возникает из-за предложения «CAST», которое я использую в подзапросе (для преобразования CHAR в INT), я просто не понимаю, почему подзапрос работает сам по себе, но этоне работает как часть основного запроса.

Так что, если я запускаю подзапрос с предложением «CAST», он работает нормально, но когда я запускаю основной запрос, который использует подзапрос, он не работаети ошибка возникает.Основной запрос можно разделить на 2 запроса, см. Код ниже.

query1 выглядит примерно так:

select SUM(Price) from TABLE1 
where X = 1
group by Country
having SUM(Price) = (query2);

query2 выглядит примерно так:

SELECT SUM(UnitPrice * AmountStocked)
FROM TABLE2
WHERE J = X and ItemNumber in (
    SELECT CAST(ItmNumbr AS INT) from TABLE3
   where Id in (select Id from TABLE4 where Z=Y)
    )

Примечания:

* query2 вернет одно число.

* Выполнение запроса2 само по себе работает нормально.

* Выполнение запроса 1 без предложения «Имеется» также работает нормально.

* Если я заменим подзапрос «SELECT CAST ...» в query2 на что-то вроде «(2002, 9912, 1234)», а затем выполню основной запрос, он будет работать нормально, так что это в значительной степени подтверждает, что проблемаэто предложение "CAST".

* Мне нужно CAST ItmNumbr в INT, потому что ItemNumber имеет числовой тип, а ItmNumbr - тип Char.

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Вы сказали:

* Я должен CAST ItmNumbr в INT, потому что ItemNumber имеет числовой тип, а ItmNumbr имеет тип Char.

Но это не так. Вы можете разыграть наоборот:

SELECT SUM(UnitPrice * AmountStocked)
FROM TABLE2
WHERE J = X and CHAR(ItemNumber) in (
    SELECT TRIM(ItmNumbr) from TABLE3
    where Id in (select Id from TABLE4 where Z=Y)
)

Преимущество здесь в том, что нечисловые символы в ItmNumber не взорвут вас, и CHAR(ItemNumber) также не должен завершиться ошибкой.

Одна вещь, которую нужно знать о DB2 for i, состоит в том, что существует два способа создания таблиц базы данных, и оба слегка отличаются по характеристикам полученной таблицы. Если таблица создана с использованием DDL (CREATE TABLE ...), то эта таблица не может содержать неверные данные. Типы данных проверяются при записи, независимо от того, как вы записываете данные, они проверяются перед записью в таблицу. Если таблица создается с помощью DDS (CRTPF ...), таблица действительно может содержать неверные данные, поскольку данные не проверяются до тех пор, пока они не будут прочитаны и загружены в переменную. Программы старого стиля, которые записывают данные в таблицы DDS путем записи записи из структуры данных, описанной программой, могут помещать все, что захотят, в таблицу, определенную DDS, включая числовые данные в символьных полях или, что еще хуже, символьные данные в числовых полях. Обычно это встречается только в очень старых базах данных, которые были перенесены из System / 36 (около 1980-х годов), в которых использовались плоские файлы, а не файлы баз данных (в ней не было понятия о базе данных). Я утверждаю это только потому, что это возможно. Проверьте данные в вашем файле, используя hex(), чтобы увидеть, есть ли что-нибудь напуганное в полях ItmNumbr или ItemNumber.

0 голосов
/ 06 мая 2019

На основании вашего анализа:

"* Если я заменим подзапрос« SELECT CAST ... »в query2 на что-то вроде« (2002, 9912, 1234) », а затем выполню основной запрос, он работаетхорошо, так что это в значительной степени подтверждает, что проблема заключается в предложении "CAST". "

Проверьте содержимое TABLE3.ItmNumbr.Если он определен как NUMERIC (десятичный без упаковки), он может содержать нечисловые значения (обычно пробелы).Это может быть причиной ошибки, которую вы наблюдаете.

0 голосов
/ 04 мая 2019

Я не уверен, но думаю, что проблема связана с вашим соединением "WHERE J = X", так как мы не знаем, что такое "J", и оно может не соединяться с "X" (не правильно тип данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...