我希望构建一个筛选器组件,其中我的搜索内容类似于b_cycle_type = '1st Day Of The Month'
而在数据库中,b_cycle_type存储为-1,0,1,2,3,4,5
如何准备postgres语句?
我在努力
SELECT "customers".* FROM "customers" WHERE (CASE customers.b_cycle_type
WHEN -1 THEN 'Last day of the month'
WHEN 0 THEN 'Align with first'
ELSE
to_char(customers.b_cycle_type, '99th') || ' Day Of The Month'
END = '27th Day Of The Month')
它没有返回我任何结果。
2条答案
按热度按时间jfewjypa1#
这部分
to_char(customers.b_cycle_type, '99th')
实际上会导致' 27th'
(to_char Docs [* 从底部开始第6个]),因此为了解决这个问题,我将使用TRIM函数。范例
您可以避免使用原始SQL,但这并不好
jv4diomz2#
但是:
1.如果
b_cycle_type
列是一个日期列,则应该将该列定义为date
类型,而不是数值类型。它将使您能够简单地执行where extract('day' from b_cycle_type) = 27
操作。它还将负责验证任何人试图插入到表中的所有数据,而不必维护自定义触发器和约束。1.如果出于某种原因必须将其设置为日偏移量,则应将其设置为
smallint
或decimal(2,0)
。另外,将其对应的实际日期保存为单独的列,以便能够轻松地计算不同长度的月份,以及二月较长时的闰年。1.如果不能改变
"customers"
表的结构,则无论何时处理该表中的数据,都应该确保b_cycle_type
介于-1和31之间,并且在给定年份中给定月份的可能天数范围内。