在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入的机制?
一种方法比另一种方法有什么特别的优势吗?
postgresql sql-injection prepared-statement plpgsql functions
我的问题与这个问题类似,但(我认为)有足够大的差异。我有一个基本范围,我想在一个表中找到所有其他范围与它和彼此冲突。或者更确切地说是形成范围的项目,但它并没有真正产生影响。
带星号的那一行是起始范围。范围 1,2 和 3 是应该扩展它的范围。结果范围应该是 X。
1 |
3 | ===1==== ====
5 | ==2== ====*==== ====
6 | ====3==== =====
--+-------------------------------------
| |<--------X-------->|
Run Code Online (Sandbox Code Playgroud)
我写过这个:
WITH cte
AS (
SELECT DATA1.ID, DATA1.STARTDATE, DATA1.ENDDATE
FROM DATA1
WHERE
DATA1.ID = @PARID AND
DATA1.STARTDATE > @STARTDATE AND
DATA1.ENDDATE < @ENDDATE
UNION ALL
SELECT DATA1.ID, DATA1.STARTDATE, DATA1.ENDDATE
FROM cte
INNER JOIN DATA1 ON (DATA1.ID = cte.ID)
WHERE
DATA1.ID = @PARID AND
(cte.STARTDATE < DATA1.ENDDATE AND cte.ENDDATE > DATA1.ENDDATE)
) …Run Code Online (Sandbox Code Playgroud) 我有一个包含一些帐户的表,以及他们的订阅的开始和结束日期。但是,这些订阅有时会重叠,我需要每个连接订阅期的开始日期和结束日期。就像示例图像中一样。
我尝试将订阅期与日期参考表合并,并标记日期(如果有订阅)。然而,代码变得相当复杂。我想一定有一个更简单的解决方案。
IF OBJECT_ID('tempdb..#Subscriptions') IS NOT NULL DROP TABLE #Subscriptions
CREATE TABLE #Subscriptions (
account_id varchar(1)
,start_date date
,end_date date
)
INSERT INTO #Subscriptions (account_id, start_date, end_date) values
('A','2019-06-20','2019-06-29'),
('A','2019-06-25','2019-07-25'),
('A','2019-07-20','2019-08-26'),
('A','2019-12-25','2020-01-25'),
('A','2021-04-27','2021-07-27'),
('A','2021-06-25','2021-07-14'),
('A','2021-07-10','2021-08-14'),
('A','2021-09-10','2021-11-12'),
('B','2019-07-13','2020-07-14'),
('B','2019-06-25','2019-08-26')
Run Code Online (Sandbox Code Playgroud) 我有一个表reservation的列roomno(INTEGER),startdate(DATE),enddate(DATE)与主键(roomno, startdate)。
我如何在表上设置约束,以便不允许预订重叠?
我试图在SQLFIDDLE postgreSQL9.3 中实现这个
例如:
101 2016-01-01 2016-01-05
101 2016-01-03 2016-01-06 [This row should not be possible to insert]
Run Code Online (Sandbox Code Playgroud)
startdate并且enddate是数据类型date。
postgresql database-design exclusion-constraint postgresql-9.3 range-types
考虑下表:
T_ID | T_START | T_END
-----+---------+------
1 | 0.25 | 0.5
2 | 0.8 | 1
3 | 0.4 | 0.6
4 | 0.2 | 0.3
5 | 0.7 | 0.8
Run Code Online (Sandbox Code Playgroud)
T_ID是独特的。每行代表一个连续范围的数字,是 0 到 1 的子集。T_START小于T_END。
我需要确定未包含在 0 和 1 之间的任何范围。请注意,某些范围确实重叠。端点的排他性与我的用例无关;我只需要确定差距的端点是什么。(因此,不考虑单点差距。)
对于这个特定的数据集,我希望结果是
GAP_START | GAP_END
----------+--------
0 | 0.2
0.6 | 0.7
Run Code Online (Sandbox Code Playgroud)
实际数据集很大,并且将聚合到其他一些数据上(数十万行,每个聚合组可能有 100 行),因此性能很重要。(不过,性能不佳但可能会改进的答案是受欢迎的。)
我曾考虑尝试首先确定覆盖范围是什么,然后尝试反转它,但我什至无法弄清楚如何计算覆盖范围。简单GROUP BY是不够的,因为我们有重叠范围链,它们会合并为一个范围,即使并非所有范围都相互重叠。我认为递归查询可能会有所帮助,但我还没有弄清楚它的逻辑。
我用这个示例数据集创建了一个 SQLFiddle 。
可悲的是(而且毫无成效),我不能随意修改底层表示。
postgresql ×2
sql-server ×2
aggregate ×1
date ×1
functions ×1
interval ×1
oracle ×1
plpgsql ×1
query ×1
range-types ×1