Проверка нескольких условий в выражении CASE SQL - PullRequest
0 голосов
/ 12 февраля 2020

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

. Здесь я показал некоторые примеры данных в ссылке SQL Fiddle ниже, но таблица city_lookup имеет 100 строк, потому что в городе несколько городов. Штат. Заявление о случае было просто попыткой поместить их в соответствующие ведра. Текст произвольной формы может содержать несколько ключевых слов, которые могут содержать города из справочной таблицы (city_lookup), и для каждого такого случая нам нужно записать посещенное состояние пользователя. Например, если текст произвольной формы содержит два города, я должен иметь возможность записать вывод в виде двух разных строк с каждым посещенным городом для одного и того же пользователя.

SQL Fiddle Link - http://sqlfiddle.com/# ! 7 / 61ef9

DDL

create table city_lookup(city varchar(50), state varchar(50));
insert into city_lookup values('dallas', 'texas');
insert into city_lookup values('austin', 'texas');
insert into city_lookup values('phoenix', 'arizona');
insert into city_lookup values('tuscon', 'arizona');
insert into city_lookup values('fresno', 'california');
insert into city_lookup values('monterey', 'california');

create table log_cities
(user_id int, visited_log varchar(512));

INSERT INTO log_cities values(123, 'This user was in dallas also probably in monterey');
INSERT INTO log_cities values(234, 'Logged: visisted tuscon');
INSERT INTO log_cities values(456, 'In March she visited texas, austin');
INSERT INTO log_cities values(567, 'He was probably here in phoenix and austin');

Запрос

select 
      user_id,
      case
        when visited_log like '%dallas%' then 'texas'
        when visited_log like '%austin%' then 'texas'
        when visited_log like '%phoenix%' then 'arizona'
        when visited_log like '%tuscon%' then 'arizona'
        when visited_log like '%fresno%' then 'california'
        when visited_log like '%monterey%' then 'california'
        else 'None' end visited_state
from
      log_cities;

Ввод и вывод

-- Actual output
123     texas
234     arizona
456     texas
567     arizona

-- Actual output expected
123     texas
123     california
234     arizona
456     texas
567     arizona
567     texas

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Вам нужно JOIN от таблицы city_lookup до таблицы log_cities, чтобы получить все города, которые посетил пользователь:

SELECT user_id,
       state
FROM city_lookup c
JOIN log_cities l ON l.visited_log LIKE CONCAT('%', c.city, '%')
ORDER BY user_id, state

Вывод:

user_id     state
123         california
123         texas
234         arizona
456         texas
567         arizona
567         texas

Демонстрация по SQLFiddle

1 голос
/ 12 февраля 2020

Вы можете использовать string_split для достижения этой цели.

select user_id, state
from log_cities lc
outer apply STRING_SPLIT(lc.visited_log, ' ') s
join city_lookup cl on cl.city = s.value

Fiddle

...