Oracle - извлечение чисел для сравнения из столбца varchar2 - PullRequest
0 голосов
/ 06 декабря 2018

Я столкнулся со следующей проблемой при решении задачи:

В базе данных Oracle у меня есть таблица ENTITY_INFO, которая довольно проста по своей структуре.Он содержит 3 столбца:

ENTITY_ID (VARCHAR2) - PK объекта в базе данных

NAME (VARCHAR2) - название информации, т.е. "местоположение", "стоимость", "последнее столкновение"

VALUE (VARCHAR2) - значение информации, то есть «активы / музыка», «1500», «1.1.2000»

В настоящее время мне нужно отфильтровать объекты, которые имеют свою «стоимость»"<1000. </p>

Наивный подход через

SELECT ENTITY_ID FROM ENTITY_INFO WHERE NAME = 'cost' AND TO_NUMBER(VALUE)<1000

не работает, поскольку столбец VALUE содержит значения, которые не являются числами.Но все значения столбцов, которые соответствуют фильтру NAME = 'cost', являются числами, поэтому дело, которое мне нужно сделать, является действительным.

Я нашел Выберите строку в качестве числа в теме Oracle , но информация внутри оказалась бесполезной для решения этой проблемы.

Из-за характера ENTITY_INFO и состояния проекта, изменение модели данных также не является жизнеспособным решением.

Спасибо за любые подсказки.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете сделать преобразование в число условным:

SELECT ENTITY_ID
FROM ENTITY_INFO
WHERE NAME = 'cost'
AND TO_NUMBER(CASE WHEN NAME = 'cost' THEN VALUE ELSE NULL END) < 1000
0 голосов
/ 06 декабря 2018

Альтернативный подход, использующий предложение WITH, при условии, что все записи с name являются числами

В части tab1 используйте условие фильтра и запрос из tab1 с TO_NUMBER

WITH tab1
     AS (SELECT entity_id, name, VALUE
           FROM entity_info
          WHERE name = 'cost')
SELECT *
  FROM tab1
 WHERE TO_NUMBER (VALUE) < 1000

Наличие цифр и символов в одном столбце - случайность, ожидающая своего происшествия.Добавление другого столбца для различения числового и нечислового значений не является опцией, я бы посоветовал иметь ограничение для предотвращения ввода нечисловых значений, если name равно cost

0 голосов
/ 06 декабря 2018

В моем компиляторе я не вижу проблем с вашим кодом (или его эквивалентом):

SELECT ENTITY_ID 
  FROM ENTITY_INFO
 WHERE NAME = 'cost'
   AND VALUE < 1000

Пример с образцами данных:

with ENTITY_INFO as (
    select 1 as ENTITY_ID,  'cost' as name, '2000' as value from dual
    union all
    select 2 as ENTITY_ID,  'cost' as name, '900' as value from dual
    union all
    select 3 as ENTITY_ID,  'cost' as name, '3000' as value from dual
    union all
    select 4 as ENTITY_ID,  'cost' as name, '2500' as value from dual
    union all
    select 5 as ENTITY_ID,  'cost' as name, '700' as value from dual
    union all
    select 6 as ENTITY_ID,  'frf' as name, '250sasd0' as value from dual
    union all
    select 7 as ENTITY_ID,  'corfrst' as name, '70fa0' as value from dual
    )
SELECT ENTITY_ID 
  FROM ENTITY_INFO
 WHERE NAME = 'cost'
   AND VALUE < 1000

Результат:

ENTITY_ID

    2

    5

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

SELECT ENTITY_ID 
  FROM (SELECT ENTITY_ID,
               VALUE
          FROM ENTITY_INFO 
         WHERE NAME = 'cost' )
 WHERE TO_NUMBER(VALUE)<1000

Надеюсь, я помог!

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