首页 > 解决方案 > 检查数字是否在字符串范围内

问题描述

我有一张桌子

ID Count Range
1 33 1-100
2 120 101-200
3 155 201-300

Range一个字符串,只能包含值1-100, 101-200, 201-300。我需要编写一个查询来检查计数和范围是否合适,所以应该弹出 155。

我的想法是:

select * 
from Tabe
where Count between (select value from string_split(Range, '-'))

但这不起作用。有谁可以帮我离开这里吗?

标签: sqlsql-servertsqlsplitbetween

解决方案


马上,我将立即建议您更改表结构,为每个范围的下限和上限设置单独的列:

| ID | Count | lower_range | upper_range |
| 1  | 33    | 1           | 100         |
| 2  | 120   | 101         | 200         |
| 3  | 155   | 201         | 300         |

使用这种改进的设计,您只需要一个简单的查询:

SELECT *
FROM yourTable
WHERE Count BETWEEN lower_range AND upper_range;

这种方法的优点是上述查询是完全可搜索的(即可以使用索引,如果定义了合适的索引)。它还避免了您必须执行一些 SQL olympics 来隔离每个连字符范围字符串的下部和上部组件。由于您的意图是将这些数字用作numbers,因此只需使用上述设计即可。

编辑:

如果您真的坚持这种设计,可以使用以下查询:

SELECT *
FROM yourTable
WHERE
    Count BETWEEN CAST(SUBSTRING([Range], 1, CHARINDEX('-', [Range]) - 1) AS int) AND
                  CAST(SUBSTRING([Range], CHARINDEX('-', [Range]) + 1, LEN([Range])) AS int);

下面演示链接的屏幕截图

演示


推荐阅读