Как обрабатывать диапазон в поле данных - PullRequest
0 голосов
/ 09 октября 2018

У меня есть набор данных с диапазонами чисел, которые сохраняются в самом поле.Так, например, в столбце возраста есть записи типа «60-64», «65+» и в поле дохода «30 \, 000-40 \, 000».Есть ли способ запросить эти поля и рассматривать их как диапазоны номеров?Таким образом, запрос для 52500 будет соответствовать диапазону дохода "50 \, 000-60 \, 000"?

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

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

1 Ответ

0 голосов
/ 09 октября 2018

Я не знаю простого способа использования SQLite, и вам, безусловно, было бы лучше реструктурировать все ваши столбцы range в два столбца каждый, range_start и range_end.

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

create table age_ranges (
    name varchar(16) unique not null
  , range_start integer unique not null
  , range_end   integer unique not null
);
insert into age_ranges (name, range_start,range_end) values ('60-64',60,64);
insert into age_ranges (name, range_start,range_end) values ('65+',65,999);

create table participant (
    name varchar(16) unique not null
  , age integer not null
  , income integer not null
);
insert into participant (name, age, income) values ('Joe Blow', 65, 900);
insert into participant (name, age, income) values  ('Jane Doe' , 61 , 1900)
;

create table question (
    question varchar(64) not null
  , relevant_age varchar(32) not null
);
insert into question (question,relevant_age) values('What is your favourite non-beige color?', '65+');
insert into question (question,relevant_age) values('What is your favourite car?', '60-64');
;
select
    p.name,
    q.question,
    q.relevant_age
from participant p
    join age_ranges r on (r.range_start <= p.age and p.age <= r.range_end)
    join question q on q.relevant_age = r.name

SQL Fiddle

В качестве альтернативы, вы также можете попробовать проанализироватьначало диапазона и конец диапазона с использованием строковых функций, таких как LEFT() и т. д., но производительность, скорее всего, будет плохой.

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