неверный синтаксис ввода для типа numeric: "" - PullRequest
0 голосов
/ 23 сентября 2018

Я получаю это сообщение в Redshift: invalid input syntax for type numeric: " ", даже после попытки выполнить совет, найденный в SO.

Я пытаюсь преобразовать текст в число.

В моемвнутреннее объединение, я стараюсь убедиться, что обрабатываемый текст сначала преобразуется в ноль, когда есть пустая строка, например так:

nullif(trim(atl.original_pricev::text),'') as original_price

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

Затем во внешнем объединении я проверяю, что есть ограниченный набор допустимых символов, и если этот тест выполняется, я пытаюсь выполнитьпреобразование to_number:

,case 
   when regexp_instr(trim(atl.original_price),'[^0-9.$,]')=0 
      then to_number(atl.original_price,'FM999999999D00') 
   else null 
 end as  original_price2

В этот момент я получаю вышеуказанную ошибку, и, к сожалению, я не вижу подробностей в datagrip, чтобы получить оскорбительное значение.

Итак, мои вопросы:

  1. Я заметил, что в моем сообщении об ошибке есть пустое место:

invalid input syntax for type numeric: " ".Имеет ли эта ошибка то же значение, что и

invalid input syntax for type numeric:'', что я вижу в аналогичных постах ??

Конечно: что я делаю не так?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Извините, я не могу поделиться реальными данными.Я провел выходные, тестируя маленькие наборы, чтобы попытаться поймать ошибку.Я обнаружил, что ошибка была вызвана тем, что во входной строке нет чисел, что разрешено моим фильтром регулярных выражений:

when regexp_instr(trim(atl.original_price),'[^0-9.$,]') . 

Я ошибочно ожидал, что нечисловая строка, такая как "$", будет иметь значение NULL, а затемфункция to_number будет = NULL.Но из эксперимента кажется, что ему нужен хотя бы один номер где-то в строке.В противном случае он сокращает строковый аргумент до пустой строки перед выполнением форматирования to_number и дросселей.

Например, select to_number(trim('$1'::text),'FM999999999999D00') будет иметь значение 1, но select to_number(trim('$A'::text),'FM999999999999D00') выдаст ошибку пустой строки.

Мое исправление заключалось в добавлении дополнительного регулярного выражения в мой начальный фильтр:

and regexp_instr(atl.original_price2,'[0-9]')>0 .  

Это гарантирует, что в строке будет хотя бы одно число и после этого ошибка с пустой строкой исчезнет.

Надеюсь, мой учебный опыт поможет кому-то еще.

0 голосов
/ 24 сентября 2018

Трудно знать наверняка без каких-либо данных и полного кода, чтобы попытаться воспроизвести пример, но, как некоторые упоминали в комментариях, наиболее вероятной причиной является используемая вами функция to_number().

В предыдущем фрагменте кода вы конвертируете original_price в текст (строку), а затем подставляете пустую строку (''), если значение равно NULL.Вызов функции to_number () для пустой строки выдаст вам описанную ошибку.

Без полного оператора SQL не ясно, почему вы помещаете функцию nullif () вокруг original_price в «внутреннее соединение»или как в действительности ли оператор CASE находится в предложении внешнего соединения или в одном из столбцов, возвращаемых запросом.Однако, возможно, вы можете изменить nullif (), чтобы заменить значение, которое можно преобразовать в число, например, «0,00» вместо «».

...