mysql поиск запятой список диапазонов номеров - PullRequest
0 голосов
/ 27 февраля 2019

В одной из полей моей таблицы указаны возрастные диапазоны.Они будут в таком формате, как

27-51,18-28,10-17
37-55,60-70
1-5,11-16,30-32,60-90
etc

Я пытаюсь построить оператор SELECT, где я могу искать, попадает ли мой возраст в какой-либо из диапазонов ... что-то типа

SELECT * from table where age IN (1-5,11-16,30-32,60-90)

Однако он будет искать в заданных диапазонах

Я могу сделать это, если у меня есть только один диапазон, использующий что-то вроде ...

WHERE age 
BETWEEN
SUBSTRING_INDEX(personsAge,"-",1) + 0 AND
SUBSTRING_INDEX(personsAge,"-",-1) + 0

, но как мне это сделать?если у меня несколько диапазонов?

1 Ответ

0 голосов
/ 28 февраля 2019

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

Внимание : Это для Sql Anywhere.Пожалуйста, измените синтаксис для MySql (особенно для функции locate, где параметры переключаются).Код не готов к работе, и я пропустил некоторые проверки достоверности.Я предполагаю, что все значения в столбце хорошо отформатированы.

Внимание 2 : Это один из тех случаев, когда кто-то бросает на вас ужасный дизайн базы данных и требует, чтобы вы решилиэта проблема.Пожалуйста, не создавайте необходимость в подобных решениях.

Функция:

CREATE FUNCTION "DBA"."is_in_range"(age_range varchar(255), age int)
returns int
begin 
  declare pos int;
  declare pos2 int;
  declare strPart varchar(50);
  declare strFrom varchar(10);
  declare strTo varchar(10);
  declare iFrom int;
  declare iTo int;

  while 1 = 1 loop
    set pos = locate(age_range, ',');
    if pos = 0 then
      -- no comma found in the rest of the column value -> just take the whole string
      set strPart = age_range;
    else 
      -- take part of the sting until next comma
      set strPart = substr(age_range, 1, pos - 1);
    end if;
    -- we are parsing the min-max part and do some casting to compare with an int
    set pos2 = locate(strPart, '-');
    set strFrom = substr(strPart, 1, pos2 - 1);
    set strTo = substr(strPart, pos2 + 1);
    set iFrom = cast(strFrom as int);
    set iTo = cast(strTo as int);

    if age between iFrom and iTo then
      return 1;
    end if;
    -- if at end of age_range then quit
    if pos = 0 then
      return 0;
    end if;
    -- get the next part of the string after the comma
    set age_range = substr(age_range, pos + 1);
    set pos = locate(age_range, ',', pos);
  end loop;

  return 0;
end;

Тестовые данные:

create local temporary table #tmpRanges (ident int, age_range varchar(255));
insert into #tmpRanges (ident, age_range) values (1, '27-51,18-28,10-17');
insert into #tmpRanges (ident, age_range) values (2, '37-55,60-70');
insert into #tmpRanges (ident, age_range) values (3, '1-5,11-16,30-32,60-90');
insert into #tmpRanges (ident, age_range) values (4, '1-50');

Вызов:

select * from #tmpRanges where is_in_range(age_range, 51) = 1;
select * from #tmpRanges where is_in_range(age_range, 10) = 1;
select * from #tmpRanges where is_in_range(age_range, 9) = 1;
etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...