Формат моего запроса вызывает ошибку преобразования данных, когда запрос никогда не должен сталкиваться с проблемой ввода - PullRequest
0 голосов
/ 26 октября 2018

У меня может быть неправильное представление о том, как работает запрос.У меня есть таблица с 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;

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

Ошибка преобразования данных: "-";

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

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

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

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

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

1 Ответ

0 голосов
/ 26 октября 2018

Ошибка, вероятно, происходит с внешним предложением 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 и сохраняйте там только целочисленные данные.

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