TSQL:如何根据多列选择范围

时间:2017-09-22 10:22:55

标签: tsql

首先,如果这个问题(我在stackoverflow中的第一个)是重复的并且我找不到它,那么道歉。我是全新的,所以仍在学习绳索。

我有一个包含4列的表格:

C1  C2  C2  C4
-------------------
1   11  111 1111
1   11  222 1111
1   22  222 2222
1   22  444 2222
1   33  444 3333
2   22  333 2222
2   33  333 3333
2   33  333 4444

2   44  444 1111 -- start range
2   44  444 4444
3   11  111 2222
3   11  222 2222 -- end range

3   22  333 2222
3   22  444 2222
4   11  111 4444
4   11  222 1111
4   44  222 2222
4   44  333 1111

如何选择所有行 “开始范围”和“结束范围”?

我这样做的方式就是这样,但我想知道是否有更好的方法?

select * from Table1

where
    -- start range
    Col1 < 2
    or
    Col1 = 2 and Col2 < 44
    or
    Col1 = 2 and Col2 = 44 and Col3 < 444
    or
    Col1 = 2 and Col2 = 44 and Col3 = 444 and Col4 < 1111
    -- end range
    or
    Col1 > 3
    or
    Col1 = 3 and Col2 > 11
    or
    Col1 = 3 and Col2 = 11 and Col3 > 222
    or
    Col1 = 3 and Col2 = 11 and Col3 = 222 and Col4 > 2222

我想澄清一下,我所追求的是是否有办法避免所有这些“或”条件;像MySQL这样的东西:

where (Col1, Col2, Col3, Col4) < (2, 44, 444, 1111) or (Col1, Col2, Col3, Col4) > (3, 11, 222, 2222)

另外,还有几点:

  • 4列是独特的组合(想象一下主键 4列);
  • 我无法控制桌子的结构,这就是我 得到;
  • 列数是任意的(我需要生成TSQL
    编程);
  • 我所展示的数据仅仅是为了问题而已 实际数据更复杂。

1 个答案:

答案 0 :(得分:0)

我会做一个除了操作员(如狗仔队已经提到的)

Select *
from YourTable
Except
select *
from YourTable
where (C1 = 2 and C2 >= 44 and C3 >= 444 and C4 >= 1111)
  or (C1 = 3 and C2 >= 11 and C3 <= 222 and C4 <= 2222)