Сравнение значения столбца с другим значением столбца + значение не работает (лучшее описание в теле) - PullRequest
0 голосов
/ 10 октября 2019

Мои извинения за название, лучше не знаю.

У меня следующая проблема, я получил сложную базу данных Oracle, которая требует, чтобы запрос проходил через некоторые обручи. Для этого конкретного запроса я хочу посмотреть, есть ли записи, в которых столбец A меньше, чем столбец B плюс 0,1.

ГДЕ выглядит следующим образом:

(
    COALESCE(TO_NUMBER(REGEXP_SUBSTR("Column1", '^\d+')), 0) 
    <
    (COALESCE(TO_NUMBER(REGEXP_SUBSTR("Column2", '^\d+')), 0) + 0.1)
)

Проблема в том, что он игнорирует значения, стоящие за точкой. Например: Столбец1 = 25,4 Столбец2 = 25,2

Это значение не должно отображаться, если 25,4 больше, чем 25,3

Если я говорю + 0,0, это работает правильно, показывая только значения, в которых Столбец1 малзатем column2 по своей природе.

Если я использую + 1.0, он также делает это правильно, если я делаю +1.2, он показывает только те, которые он просто повторяет, как если бы это было + 1.0

Любые предложения? Я не настолько опытен с Oracle, это единственная база данных (я, к сожалению) должна работать с ней.

Образец:

ID    Column1     column2
1     25.4        25.2
2     RA          16
3     22          23.1
4     21          22
5     -12.2      -12.15
6     RA          0
7     11.3792     11.3538
8     0           -.023
9     1.05        .95

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Это ситуация, когда вы можете использовать выражение case:

(case when not regexp_like(column1, '^[0-9]+[.]?[0-9]*$') 
      then null
      when not regexp_like(column2, '^[0-9]+[.]?[0-9]*$') 
      then null
      where to_number(column1) < to_number(column1)
      then 1
 end) = 1

Я обычно не фанат case выражений в условных выражениях. Однако проблемы преобразования типов - это ситуация, когда они полезны.

0 голосов
/ 10 октября 2019

На основе ваших данных выборки посмотрите, поможет ли что-то вроде этого:

SQL> with test (id, col1, col2) as
  2    (select 1, '25.4', '25.2'    from dual union all
  3     select 2, 'RA'  , '16'      from dual union all
  4     select 3, '22'  , '23.1'    from dual union all
  5     select 4, '21'  , '22'      from dual union all
  6     select 5, '-12.2', '-12.15' from dual union all
  7     select 6, 'RA'  , '0'       from dual union all
  8     select 7, '11.3972', '11.3538' from dual union all
  9     select 8, '0', '-0.023'     from dual union all
 10     select 9, '1.05', '.95'     from dual
 11    ),
 12  subset as
 13    (select *
 14     from test
 15     where regexp_like(col1, '^(-)?(\d+)?(\.\d+)?$')
 16       and regexp_like(col2, '^(-)?(\d+)?(\.\d+)?$')
 17    )
 18  select *
 19  from subset
 20  where to_number(col1, '999999999.99999999', 'nls_numeric_characters = .,') <
 21        to_number(col2, '999999999.99999999', 'nls_numeric_characters = .,') + 0.1;

        ID COL1    COL2
---------- ------- -------
         3 22      23.1
         4 21      22
         5 -12.2   -12.15
         7 11.3972 11.3538
         8 0       -0.023

SQL>
  • subset CTE проверяет, содержат ли столбцы числа
  • , если это так, окончательное значение select преобразует строки в числа с использованием маски формата вместе с NLS_NUMERIC_CHARACTERS (чтобы отличить тысячи разделителей от десятичных точек)

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

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