2016-08-28 4 views
0

Я выбирал определенные значения из базы данных, но, к сожалению, в итоге это вызвало ошибку "Invalid number", поэтому я подозреваю некоторые не номера в столбцах. Интересная вещь, она работает в оракула разработчика SQL, но когда дело доходит до C# кода он бросает "Invalid number", так странно, вот мой запросКак удалить ненулевые номера из запроса select в oracle

select height+weight as total from tbl_human 

Таким образом, я изменил на следующий запрос, но все становится 0, как исправить.

select REGEXP_REPLACE('height+weight','[^0-9]+','0') as total from tbl_human 

EDIT

высота и вес varchars

+0

Какими типами данных являются «высота» и «вес»? Сохраняются ли они как строки, а не как числа? У Oracle есть плохая привычка неявно преобразовывать строки в числа и выполнять арифметику по результатам, а не просто бросать ошибку, чтобы предупредить вас о том, что вы выполняете арифметику по строкам. Тогда: Чего вы хотите получить? Если у вас есть 178 в высоту (например, в см) и «ABCD» в весе, хотите ли вы, чтобы вес был преобразован в 0 и добавлен к высоте? Зачем? Каково реальное оправдание этому?(Вместо того, чтобы преобразовать его в нуль, так что результат добавления тоже нулевый). – mathguy

+0

Также вы говорите об «числах» и «целых числах» - это высота и вес всегда целые числа? не может быть весом 74,5 (скажем, в кг?) – mathguy

+0

оба являются varchars в datatbase, но мне это нужно, как говорят 178.2 + 170.6 = 348.8 – peter

ответ

0

К сожалению у меня не хватает репутации комментировать. У меня есть несколько вопросов:

  • Что типы данных являются height и weight столбцы?
  • Что вы ожидаете получить от оператора select? Приведите пример, пожалуйста.

Что касается REGEXP_REPLACE('height+weight','[^0-9]+','0').

Что вы делаете здесь просто заменив строку 'height+weight' с '0' начиная 'height+weight' соответствует регулярному выражению '[^0-9]+'. Вы должны использовать:

REGEXP_REPLACE(height + weight,'[^0-9]+','0') 

Edit:

Я думаю, что это должно работать:

select (CAST(height AS decimal)+ CAST(weight AS decimal)) as total from tbl_human; 
+1

Это не выглядит слишком хорошо, так как высота и вес могут быть индивидуально не номерами, поэтому код будет недействительным в +, прежде чем он когда-либо достигнет regexp_replace. – mathguy

+0

Итак, как исправить ошибку – peter

+0

@mathguy Я согласен, просто хотел исправить использование REGEXP_REPLACE –

0

ОК, так что вы хотите, чтобы поймать значения в любом столбце (высота или вес) которые не являются числом, отформатированным в виде символьной строки. И вы хотите преобразовать их в 0. Вам придется делать это по каждому значению отдельно, прежде чем добавлять их (иначе добавление завершится неудачно, прежде чем вы когда-нибудь перейдете на regexp_replace).

Это один из способов. Он предполагает, что все, что не является числом, должно быть преобразовано в 0, даже если, например, в столбце weight у вас есть значение '75.5kg' - так как это не число, оно будет преобразовано в 0.

Вместо того, чтобы показывать полное решение, я просто показываю, что нужно применять к weight, прежде чем добавить что-то подобное для height.

with 
    inputs (weight) as (
     select '87.5' from dual union all 
     select '87.5 kg' from dual union all 
     select '68'  from dual union all 
     select 'abcd' from dual 
    ) 
select weight, 
     case when regexp_like(weight, '^\d+(\.\d*)?$') then to_number(weight) 
      else 0 end as adj_weight 
from inputs; 

WEIGHT ADJ_WEIGHT 
------- ---------- 
87.5   87.5 
87.5 kg   0 
68    68 
abcd    0 
+0

Я не понимаю, что вы сказали – peter

+0

Вы имеете в виду, что вы не знаете, как использовать то, что я разместил здесь в вашем коде? Чтобы сгенерировать столбец «total», вы должны «select (case when ... else end 0) + (case when ... else end 0) как total from tbl_human', где первый' (case ... end) ' это то, что я показываю (для WEIGHT), а второй '(case ... end)' очень похож, но должен быть для HEIGHT. – mathguy

+0

Я также говорю, что вы должны делать эту обработку по весу и отдельно по высоте, а затем добавлять два результата друг другу. В своей первоначальной попытке вы сначала добавили их друг другу, а затем попытались что-то сделать с результатом. Это не сработает, первое, что должен сделать движок базы данных, - это добавить два числа, и если один из них на самом деле не является числом, то механизм будет выдавать ошибку прямо тогда и там, он даже не пойдет дальше чтобы увидеть, что вы пытались применить некоторые корректировки ПОСЛЕ расчета суммы. – mathguy

Смежные вопросы