我的表如下所示:
|--------|--------|--------|--------|---------|---------|
| num_1 | num_2 | num_3 |level_1 | level_2 | level_3 |
|--------|--------|--------|--------|---------|---------|
| 1111 | 3333 | 4444 | false | false | false |
|--------|--------|--------|--------|---------|---------|
| 1111 | 3333 | 5555 | false | false | false |
|--------|--------|--------|--------|---------|---------|
| 1111 | 6666 | null | false | false | false |
|--------|--------|--------|--------|---------|---------|
| 1111 | 7777 | 8888 | false | true | false |
|--------|--------|--------|--------|---------|---------|
所以表格看起来是这样的:
|--------|--------|--------|--------|---------|---------|-------------|
| num_1 | num_2 | num_3 |level_1 | level_2 | level_3 | result |
|--------|--------|--------|--------|---------|---------|-------------|
| 1111 | 3333 | 4444 | false | false | false | 3333 |
|--------|--------|--------|--------|---------|---------|-------------|
| 1111 | 3333 | 5555 | false | false | false | 3333 |
|--------|--------|--------|--------|---------|---------|-------------|
| 1111 | 6666 | null | false | false | false | 6666 |
|--------|--------|--------|--------|---------|---------|-------------|
| 1111 | 7777 | 8888 | false | true | false | 8888 |
|--------|--------|--------|--------|---------|---------|-------------|
编辑
这是一个简化的例子,但下面是这个表的工作原理:
num_x
列将ID引用到另一个表中的元素,该表可能具有也可能不具有我们正在查找的某个属性level_x
列表示具有相同x
值的列num_x
是否具有设置为true
的特定属性。这些条目表示具有或不具有该属性的元素的层次结构:
1111 ✘ > 3333 ✘ > 4444 ✘
> 5555 ✘
> 6666 ✘
> 7777 ✓ > 8888 ✘
我的目标是浏览整个表,为每一行找到上一级别没有true
值的子级别的最低级别。例如,对于前几行,由于所有行都是1111
的子行,并且1111
有一个子级7777
,其属性设置为true
,所以与7777
处于同一级别的所有其他子级都将是其自己行的结果,除非它们也有属性设置为true
的子级。由于7777
的属性设置为true
,所以此行的结果是其直接子级8888
。如果没有子项,则该行不需要结果。
下面的简单逻辑返回您指定的值。目前还不清楚这是否是你真正想要的:
select (case when not level_2 then num_3
else num_2
end)
我的最佳猜测是,您需要一个相对简单的case
表达式。我只是不清楚你真正需要什么。