django 将值与列中的范围值匹配

slmsl1lt  于 2023-08-08  发布在  Go
关注(0)|答案(6)|浏览(129)

我有一个表,其中列注册年份的值像'2017-2019'和'2014-2016。
如果我的输入值是2018年,那么我的SQL查询将获得“2017- 2019”之间的记录。
| 注册年| registration_year |
| --| ------------ |
| 2014-2016年| 2014-2016 |
| 2017-2019年| 2017-2019 |
上面是DB表,我的输入是2018年。然后它应该返回id 2。
什么是我的SQL查询。先谢了

qcbq4gxm

qcbq4gxm1#

老实说,现在是改变table设计的好时机。考虑这个版本,它将注册开始和结束年份存储在不同的列中:

id | registration_start | registration_end
1  | 2014               | 2016
2  | 2017               | 2019

字符串
有了这个正确设计的表,现在您只需要进行一个简单的范围比较:

SELECT *
FROM yourTable
WHERE registration_start <= 2018 AND registration_end >= 2018;

33qvvth1

33qvvth12#

... WHERE @input_value BETWEEN SUBSTRING_INDEX(column, '-', 1) AND SUBSTRING_INDEX(column, '-', -1)

字符串

isr3a4wc

isr3a4wc3#

我同意TB的回答,你应该重新设计你的表结构。这里有一个解决方案与目前的结构。

select id
from my_table 
where left(registration_year, 4)::integer <= 2018
  and right(registration_year, 4)::integer >= 2018;

字符串

a9wyjsp7

a9wyjsp74#

要检索与SQL表中的注册年份范围相匹配的输入年份(2018)的记录,可以使用以下SQL查询和BETWEEN运算符:

SELECT 
  id, registration_year 
FROM your_table_name 
  WHERE 
    2018 BETWEEN 
      SUBSTRING(registration_year, 1, 4) AND
      SUBSTRING(registration_year, 6, 4);

字符串

jjjwad0x

jjjwad0x5#

如果您总是,或几乎总是,开始和结束在一起,那么将列定义为整数范围,而不是字符串。这仍然导致单个柱。然后用range containment operator<@)查询。所以:(参见演示)

create table my_table( id   integer  generated always as identity
                                     primary key 
                     , registration int4range
                     );
select * 
  from my_table 
 where <input_year> <@ registration;

字符串
演示结果说明。查询时,registration列将显示为[2017,2020)。这对于您的数据值是正确的(第2行)。这是因为当被查询时,Postgres总是响应为 * 包含下限,但不包含上限 *。但是,您会注意到该行创建为 * 包含下限和包含上限 *。

h9a6wy2h

h9a6wy2h6#

保持数据库正常化总是更好的。最基本的规范化步骤是拥有“原子”列(每列都应该有尽可能精确和单一的信息)。
最好改变数据库的设计,并为“start_date”和“end_date”设置单独的列。

id || start_year || end_year

字符串
这将使查询您的数据库更容易。
使用当前设计,可以使用以下查询获取所需的输出:

SELECT * FROM table_name 
WHERE
SUBSTRING(registeration_year,1,4) <= 2018 
AND 
SUBSTRING(registeration_year,6,4) >= 2018


总而言之,最好的解决方案是尽快更改数据库设计。

相关问题