как запросить несколько символов в одном поле? - PullRequest
0 голосов
/ 07 ноября 2019

Моя база данных - Oracle 11g.

Я хочу сделать запрос в sql. Критерии запроса должны соответствовать некоторым символам поля:

    description
    CWLV321900017391;EFHU3832239
    CWLV321900017491;ERHU3832239
    CWLV321900017591;ERHU3832239
    CWLV321900017691;ERHU3832239

Мой запрос выглядит так:

select * from product where description in ('CWLV321900017391', 'CWLV321900017491'); 

Он не возвращает записей в результате.

Я ожидаю результат, как показано ниже:

    description
    CWLV321900017391;EFHU3832239
    CWLV321900017491;ERHU3832239

Как получить его с помощью SQL?

спасибо.

Ответы [ 4 ]

1 голос
/ 07 ноября 2019

Существуют различные способы ее решения. Вот один из них:

select * from product 
where instr (description, 'CWLV321900017391') > 0
or    instr (description, 'CWLV321900017491') > 0;

Если вы знаете, что всегда ищете начало description, вы можете использовать:

select * from product 
where substr (description, 1, 16) in ('CWLV321900017391','CWLV321900017491')

Также есть решение LIKE или REGEX_LIKE. На самом деле это зависит от того, какие строки вы ищете.


Конечно, ни одно из этих решений не является действительно удовлетворительным, и для больших объемов данных может показаться бесполезной производительность. Проблема в том, что исходная модель данных нарушает Первая нормальная форма , сохраняя неатомарные значения. Плохие модели данных порождают неуклюжий SQL.

1 голос
/ 07 ноября 2019

Вы используете IN для поиска частичного совпадения строки в таблице description. Это не вернет результаты, так как IN будет соответствовать только точным значениям.

Вместо этого, один из способов добиться этого - использовать оператор LIKE с %:

select  *
  from  product
  where (description LIKE 'CWLV321900017391%' OR
        description LIKE 'CWLV321900017491%'); 

% в конце указывает, что что угодно может следовать после указанного текста.

Это вернет любой description, который начинается с CWLV321900017391 или CWLV321900017491.

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

description LIKE '%CWLV321900017391%' OR description LIKE '%CWLV321900017491%'
0 голосов
/ 07 ноября 2019

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

Если вы застряли со строками в этом формате, вы должны принять во внимание разделители. Вы можете сделать это, используя like:

where ';' || description || ';' like '%;CWLV321900017391;%'

Вы также можете сделать нечто подобное с regexp_like(), если хотите найти одно из нескольких значений:

where regexp_like(';' || description || ';',
                  '(;CWLV321900017391;)|(;CWLV321900017391;)'
                 )
0 голосов
/ 07 ноября 2019

Вы можете попробовать ниже путь -

select * from product 
where substr(description,1,instr(description,';',1,1)-1) in ('CWLV321900017391', 'CWLV321900017491')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...