Получение строки, когда в SQL появляются определенные текстовые строки - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь получить строки, которые содержат только определенные текстовые строки.Проблема в том, что иногда текстовая строка может смешиваться с другими текстовыми строками, и когда это происходит, я НЕ хочу получать эту строку.Вот идея данных, с которыми я работаю:

    MED_TABLE
______________________________________
med_code    |   med_name
______________________________________
1            calcium potassium iodine fluoride
2            potassium calcium
3            hydrochloride; calcium
4            iodine, calcium, fluoride
5            iodine calcium phosphate
6            calcium phosphate 
7            IODINE
8            calcium PHOSPHATE iodine

Если я хочу вернуть строки, содержащие ТОЛЬКО строки «фосфат кальция» и / или «йод», независимо или в паре,Какой эффективный способ сделать это?В этом случае я хотел бы только вернуть строки 5, 6, 7, 8.

Я пытался сделать это с помощью запроса, подобного следующему:

SELECT med_code, med_name
FROM med_table
WHERE lower(med_name) LIKE '%calcium phosphate%'
OR WHERE lower(med_name) LIKE '%iodine%'

Но это возвращаетстроки, которые содержат текстовые строки, которые я не хочу.

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

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

SELECT med_code, med_name
FROM med_table
WHERE (lower(med_name) LIKE '%calcium phosphate%' AND length(Column)=18 

OR WHERE (lower(med_name) LIKE '%iodine%' AND length(Column)= 7)

Длина столбца должна быть равна Длина строки предложения LIKE. Проверьте синтаксис, как только что написали эту среду выполнения. Также добавьте условие для обеих комбинаций строки, таких как «кальций фосфат йод» и «йод ....»

0 голосов
/ 31 мая 2019

Использование rlike:

with your_data as (
select stack (8,
1,'calcium potassium iodine fluoride',
2,'potassium calcium',
3,'hydrochloride\\; calcium',
4,'iodine, calcium, fluoride',
5,'iodine calcium phosphate',
6,'calcium phosphate' ,
7,'IODINE',
8,'calcium PHOSPHATE iodine') as (med_code,med_name)
)

select * from your_data 
 where med_name rlike '(?i)calcium phosphate' --(?i) means case insensitive
    or med_name rlike '^(?i)iodine$'          --with string begin(`^`) and end(`$`) anchors
;

Возвращает:

your_data.med_code  your_data.med_name  
5   iodine calcium phosphate    
6   calcium phosphate   
7   IODINE  
8   calcium PHOSPHATE iodine    

Это работает в Улей

0 голосов
/ 31 мая 2019

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

SELECT med_code, med_name
FROM med_table
WHERE
  length(trim(
    regexp_replace(regexp_replace(regexp_replace(lower(med_name), 'calcium phosphate', ''), 'iodine', ''), ',', '')
  )) = 0 

См. demo (для MySql разница составляетиспользование replace вместо Hive's regexp_replace).Результаты:

| med_code | med_name                 |
| -------- | ------------------------ |
| 5        | iodine calcium phosphate |
| 6        | calcium phosphate        |
| 7        | IODINE                   |
| 8        | calcium PHOSPHATE iodine |
...