我有一个表,其中列注册年份的值像'2017-2019'和'2014-2016。如果我的输入值是2018年,那么我的SQL查询将获得“2017- 2019”之间的记录。| 注册年| registration_year || --| ------------ || 2014-2016年| 2014-2016 || 2017-2019年| 2017-2019 |上面是DB表,我的输入是2018年。然后它应该返回id 2。什么是我的SQL查询。先谢了
qcbq4gxm1#
老实说,现在是改变table设计的好时机。考虑这个版本,它将注册开始和结束年份存储在不同的列中:
id | registration_start | registration_end 1 | 2014 | 2016 2 | 2017 | 2019
字符串有了这个正确设计的表,现在您只需要进行一个简单的范围比较:
SELECT * FROM yourTable WHERE registration_start <= 2018 AND registration_end >= 2018;
型
33qvvth12#
... WHERE @input_value BETWEEN SUBSTRING_INDEX(column, '-', 1) AND SUBSTRING_INDEX(column, '-', -1)
字符串
isr3a4wc3#
我同意TB的回答,你应该重新设计你的表结构。这里有一个解决方案与目前的结构。
select id from my_table where left(registration_year, 4)::integer <= 2018 and right(registration_year, 4)::integer >= 2018;
a9wyjsp74#
要检索与SQL表中的注册年份范围相匹配的输入年份(2018)的记录,可以使用以下SQL查询和BETWEEN运算符:
BETWEEN
SELECT id, registration_year FROM your_table_name WHERE 2018 BETWEEN SUBSTRING(registration_year, 1, 4) AND SUBSTRING(registration_year, 6, 4);
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总是响应为 * 包含下限,但不包含上限 *。但是,您会注意到该行创建为 * 包含下限和包含上限 *。
registration
[2017,2020)
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
型总而言之,最好的解决方案是尽快更改数据库设计。
6条答案
按热度按时间qcbq4gxm1#
老实说,现在是改变table设计的好时机。考虑这个版本,它将注册开始和结束年份存储在不同的列中:
字符串
有了这个正确设计的表,现在您只需要进行一个简单的范围比较:
型
33qvvth12#
字符串
isr3a4wc3#
我同意TB的回答,你应该重新设计你的表结构。这里有一个解决方案与目前的结构。
字符串
a9wyjsp74#
要检索与SQL表中的注册年份范围相匹配的输入年份(2018)的记录,可以使用以下SQL查询和
BETWEEN
运算符:字符串
jjjwad0x5#
如果您总是,或几乎总是,开始和结束在一起,那么将列定义为整数范围,而不是字符串。这仍然导致单个柱。然后用range containment operator(<@)查询。所以:(参见演示)
字符串
演示结果说明。查询时,
registration
列将显示为[2017,2020)
。这对于您的数据值是正确的(第2行)。这是因为当被查询时,Postgres总是响应为 * 包含下限,但不包含上限 *。但是,您会注意到该行创建为 * 包含下限和包含上限 *。h9a6wy2h6#
保持数据库正常化总是更好的。最基本的规范化步骤是拥有“原子”列(每列都应该有尽可能精确和单一的信息)。
最好改变数据库的设计,并为“start_date”和“end_date”设置单独的列。
字符串
这将使查询您的数据库更容易。
使用当前设计,可以使用以下查询获取所需的输出:
型
总而言之,最好的解决方案是尽快更改数据库设计。