如何处理数据字段中的范围

时间:2018-10-09 01:20:33

标签: sql sqlite

我有一组数据,其数字范围保存到字段本身。因此,例如,在“年龄”列中有“ 60-64”,“ 65+”之类的条目,在收入字段中有“ 30 \,000-40 \,000”。有没有办法查询这些字段并将它们视为数字范围?因此,查询52500是否符合收入范围“ 50 \,000-60 \,000”?

预处理输入是我当前的首要想法,在查询数据库之前,我只是将用户输入映射到这些字段的所有可能值。但是我想知道是否有更好的方法。

假设我根本无法修改数据库或创建新数据库。

1 个答案:

答案 0 :(得分:0)

我不了解使用SQLite的简便方法,当然最好将所有range列重组为range_startrange_end两列。 / p>

如果您的范围是固定范围,则可以从单独的表格中获得最小值/最大值:

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()等字符串函数来分析范围的起点和终点,但是性能可能会变差。