如何在这两个表中使用case语句
How to use case statement in these two tables
在 SQL 我创建了一个临时的 table 如下所示:
Rank
Rate
Roles
1
V High
!A!B!C!D!
2
High
!D!F!B!H!
3
Low
!F!B!P!K!
4
V Low
!P!Q!A!H!
较高评级(例如高(等级 2))角色(例如 F)可以批准较低评级记录(例如高到 V 低(等级 2-4))但不能批准较高评级记录(例如 V高(等级 1))。
对于任何多次出现的 Role,我们需要考虑更高的 Rank(即 Rank 具有较低的价值)。前任。对于角色F,更高的等级应该被认为是2(即高),因为它同时出现在高和低行中。
以下是永久 table 的样本数据。实际上它有很多数据。
Rate
Role
Low
Q
Low
H
V High
H
Low
D
V Low
A
High
C
High
Q
现在需要将临时 table 中的不同角色与实际 table 中的角色进行比较。
那么下面的记录:
Rate
Role
Low
Q
因为Q只出现在'V Low'(等级4)所以他不能批准'Low'级别。所以Flag需要设置为1。如果角色可以批准记录那么flag需要设置为0。
其他人的类似输出应如下所示:
Rate
Role
Flag
Low
Q
1
Low
H
0
V High
H
1
Low
D
0
V Low
A
0
High
C
0
High
Q
1
请帮我解决这个问题。
谢谢。
有许多不同的方法可以实现这一点,但一种可能的方法是:
SELECT
t1.rate,
t1.role,
CASE WHEN (SELECT min(rank) FROM temptable t3 WHERE t3.roles LIKE concat('%!', t1.role, '!%')) <= t2.rank THEN 0 ELSE 1 END flag
FROM maintable t1 INNER JOIN temptable t2
on t1.rate = t2.rate
t1.rate = t2.rate
上的join是为了获取rank的数值。 SELECT
中的子查询获得其角色的“最高”排名(实际上是 min
数值)并且 CASE
语句将其与主(非临时)的值进行比较) table.
请注意,我在子查询中使用了 concat
,因为我认为大多数现代 DBMS 都支持它,但您可以使用其他内容来与其余查询保持一致(例如 '%!'+t1.role+'!%'
in SQL 服务器或 '%!'||t1.role||'!%'
在 Oracle 中)。
我认为这是一个合理的查询,但是会有很多不同的方法来实现。希望对你有帮助。
在 SQL 我创建了一个临时的 table 如下所示:
Rank | Rate | Roles |
---|---|---|
1 | V High | !A!B!C!D! |
2 | High | !D!F!B!H! |
3 | Low | !F!B!P!K! |
4 | V Low | !P!Q!A!H! |
较高评级(例如高(等级 2))角色(例如 F)可以批准较低评级记录(例如高到 V 低(等级 2-4))但不能批准较高评级记录(例如 V高(等级 1))。 对于任何多次出现的 Role,我们需要考虑更高的 Rank(即 Rank 具有较低的价值)。前任。对于角色F,更高的等级应该被认为是2(即高),因为它同时出现在高和低行中。
以下是永久 table 的样本数据。实际上它有很多数据。
Rate | Role |
---|---|
Low | Q |
Low | H |
V High | H |
Low | D |
V Low | A |
High | C |
High | Q |
现在需要将临时 table 中的不同角色与实际 table 中的角色进行比较。 那么下面的记录:
Rate | Role |
---|---|
Low | Q |
因为Q只出现在'V Low'(等级4)所以他不能批准'Low'级别。所以Flag需要设置为1。如果角色可以批准记录那么flag需要设置为0。
其他人的类似输出应如下所示:
Rate | Role | Flag |
---|---|---|
Low | Q | 1 |
Low | H | 0 |
V High | H | 1 |
Low | D | 0 |
V Low | A | 0 |
High | C | 0 |
High | Q | 1 |
请帮我解决这个问题。
谢谢。
有许多不同的方法可以实现这一点,但一种可能的方法是:
SELECT
t1.rate,
t1.role,
CASE WHEN (SELECT min(rank) FROM temptable t3 WHERE t3.roles LIKE concat('%!', t1.role, '!%')) <= t2.rank THEN 0 ELSE 1 END flag
FROM maintable t1 INNER JOIN temptable t2
on t1.rate = t2.rate
t1.rate = t2.rate
上的join是为了获取rank的数值。 SELECT
中的子查询获得其角色的“最高”排名(实际上是 min
数值)并且 CASE
语句将其与主(非临时)的值进行比较) table.
请注意,我在子查询中使用了 concat
,因为我认为大多数现代 DBMS 都支持它,但您可以使用其他内容来与其余查询保持一致(例如 '%!'+t1.role+'!%'
in SQL 服务器或 '%!'||t1.role||'!%'
在 Oracle 中)。
我认为这是一个合理的查询,但是会有很多不同的方法来实现。希望对你有帮助。