Формат моего запроса вызывает ошибку преобразования данных, когда запрос никогда не должен встречать проблемную запись

Возможно, я неправильно понимаю, как работает запрос. У меня есть таблица с 3 столбцами (id, int1, int2), которые меня интересуют. Int1 и int2 могут содержать положительные целые числа или символ '-'. По причинам, не зависящим от меня, я не могу изменить формат и заменить '-' для представления целых чисел. Ниже мой запрос.

CREATE TABLE table1 AS (SELECT id, int1, int2 FROM CSVREAD(someCSV));

SELECT count(id)
FROM (SELECT id, int1, int2
      FROM table1
      WHERE int1 NOT LIKE '-' AND int2 NOT LIKE '-')
WHERE int1 > 100 AND int2 > 100;

Насколько я понимаю, внешний запрос должен использовать результат подзапроса, что означает, что внешний запрос не должен видеть никаких '-', но когда я пытаюсь запустить это, я получаю следующую ошибку

Data conversion error converting "-";

У меня есть обходной путь, используя оператор case, но я хотел бы знать, почему это не работает так, как я думал.

Редактировать: Я понял, что это звучит так, как будто столбец может иметь «-» между целыми числами. На самом деле в записи будет либо знак «-», либо целое число, но не их комбинация. Я добавил создание таблицы в фрагмент кода.

Образец таблицы (это также формат csv)

|---------|----------|--------|
|    id   |   int1   |  int2  |
|---------|----------|--------|
|    1    |   34     |  120   |
|---------|----------|--------|
|    2    |   -      |  -     |
|---------|----------|--------|
|    3    |   200    |  200   |
|---------|----------|--------|
|    4    |   15     |  90    |
|---------|----------|--------|
|    5    |   130    |  145   |
|---------|----------|--------|

Подзапрос возвращает все строки только с целыми числами.

Я добавил принцип создания таблицы, а также лучшее описание

Mr_H 26.10.2018 08:48

На самом деле это не меняет того, что я дал бы в качестве ответа.

Tim Biegeleisen 26.10.2018 08:51

Извините за ошибку, по какой-то причине я не заметил, что вы также добавили актерский состав. Спасибо, похоже, проблема заключалась в отсутствии CAST. Я все еще немного не понимаю, почему приведение его к INT может решить проблему преобразования данных, если преобразование данных не является преобразованием?

Mr_H 26.10.2018 09:00

Столбцы int1 и int2 не являются int типы; они текст. Значит, вам нужно их разыграть. В некоторых базах данных, таких как MySQL, в этом нет необходимости. Очевидно, это необходимо в H2.

Tim Biegeleisen 26.10.2018 09:02
2
4
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка, вероятно, происходит с внешним предложением WHERE:

WHERE int1 > 100 AND int2 > 100

когда он достигает значений int1 и / или int2, в которых есть тире. Это происходит, возможно, вопреки тому, что вы думаете, потому что ваши выражения LIKE неверны. Чтобы проверить наличие тире в любом месте в столбце, вы должны использовать что-то вроде этого:

WHERE int1 NOT LIKE '%-%'

Вот ваш исправленный запрос:

SELECT COUNT(*)
FROM
(
    SELECT id, int1, int2
    FROM table1
    WHERE int1 NOT LIKE '%-%' AND int2 NOT LIKE '%-%'
) t
WHERE CAST(int1 AS INT) > 100 AND CAST(int2 AS INT) > 100;

Мы могли бы даже улучшить вышеуказанный запрос, например найдя способ устранить подзапрос. Но лучшим подходом было бы прекратить смешивать числовые и текстовые данные в одном столбце. Если вам нужно, чтобы int1 и int2 вели себя как целочисленные столбцы, сделайте их INT и храните там только целочисленные данные.

В идеале, да, столбцы должны содержать только INT, если это моя цель, но, к сожалению, у меня нет контроля над исходными данными. Я полагаю, я мог бы создать временную таблицу.

Mr_H 26.10.2018 08:43

Другие вопросы по теме