如何在这两个表中使用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 中)。

我认为这是一个合理的查询,但是会有很多不同的方法来实现。希望对你有帮助。