【问题标题】:How subtract numerical ranges in SQL?如何减去 SQL 中的数值范围?
【发布时间】:2015-12-21 21:18:33
【问题描述】:

如何在 SQL 中减去数值范围?

例如:

SELECT 01 AS 'BEGIN', 99 AS 'END'
EXCEPT
SELECT 01 AS 'BEGIN', 15 AS 'END'

预期结果:

16 AS 'BEGIN', 99 AS 'END'

一个更完整的例子:

COMPLETE
BEGIN ---- END
 01         99

EXTRACT
BEGIN ---- END
 15         30

RESULT
BEGIN ---- END
 01         14
 31         99 

有可能吗?

【问题讨论】:

  • 你的问题有点含糊。你从什么数据开始?
  • 他想选择 1 - 99,但从结果中删除 1 - 15
  • 您必须在您的问题中加入一些上下文。这个问题不清楚,但我想我明白你想要做什么。问题是您的示例过于简化,因此不再是可行的 sql 代码。要真正解决您的问题,需要具体细节,因为没有EXCEPT 声明。相反,代码必须计算出所需的结果。如果您可以提供示例表结构,我们可以提供帮助。
  • 您要减去的范围是否落在中间?
  • 我编辑了这个问题,看看我是否理解得更好

标签: sql asp.net .net sql-server


【解决方案1】:

试试这个:

;WITH Complete AS (
   SELECT 1 AS [BEGIN], 99 AS [END]
), Extract AS (
   SELECT 1 AS [BEGIN], 15 AS [END]
), FreeSpace AS (
   SELECT (SELECT [BEGIN] - 1 FROM Extract) AS [LEFT],
          (SELECT [END] + 1 FROM Extract) AS [RIGHT]
)
SELECT [BEGIN], [END]
FROM (
SELECT [BEGIN], (SELECT [LEFT] FROM FreeSpace) AS [END]
FROM Complete

UNION ALL 

SELECT (SELECT [RIGHT] FROM FreeSpace) AS [BEGIN], [END]
FROM Complete ) AS t
WHERE [END] >= [BEGIN]

Demo here

CTE 描述:

  • Complete 是我们要从中减去另一个区间的区间
  • Extract 是要从Complete 中提取的区间
  • FreeSpace 包含Extract 左侧和右侧的 'free' 边界

示例:

Extract:            15----------30
                  14              31  
FreeSpace: <------|               |------------->

使用来自FreeSpace 的值1431Extract 的左侧和右侧构造两个可能的非重叠区间。

谓词:

WHERE [END] >= [BEGIN]

最后检查这两个区间是否真的存在。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多