您好我有以下要求
表A
CRD | RNo | J_NAME
-------------------------
DOS1 |1 | NULL
DOS2 |2 | Name 1
DOS3 |3 | Name 2
DOS4 |4 | Name 3
DOS5 |5 | Name 1
DOS6 |6 | Name 1
DOS7 |7 | Name 4
DOS8 |8 | Name 2
输出应该是
CRD | RNo | J_NAME
-------------------------
DOS1 |1 | NULL
DOS2 |2 | A
DOS3 |3 | B
DOS4 |4 | C
DOS5 |5 | A
DOS6 |6 | A
DOS7 |7 | D
DOS8 |8 | B
Null allays应该为null,如果名称已存在于目标表中,那么它将添加相同的名称,例如:J_Name = A和B,如果源值不在目标表中,那么它将获得一个新的从列表中输入。
我能做到吗?
答案 0 :(得分:0)
您可以尝试这样的事情: -
SELECT CRD, RNo,
CASE WHEN J_NAME ='Name 1' THEN 'A'
WHEN J_NAME ='Name 2' THEN 'B'
WHEN J_NAME ='Name 3' THEN 'C'
WHEN J_NAME ='Name 4' THEN 'D'
ELSE 'NULL' END AS J_NAME
FROM TAB;
答案 1 :(得分:0)
如果您确定不会用完字母(因为您没有告诉如何生成Z
以外的值),您可以只是密集您的名字并给它们一个对应于该等级的字母;
WITH cte AS (
SELECT * FROM mytable UNION ALL SELECT '', 0, NULL FROM DUAL
)
SELECT crd, rno, CASE WHEN j_name IS NULL THEN NULL ELSE CHR(calc+63) END j_name
FROM (
SELECT crd, rno, j_name, DENSE_RANK() OVER (ORDER BY j_name NULLS FIRST) calc
FROM cte
)
WHERE rno > 0 ORDER BY rno;
它基本上取表格内容,添加一个空J_NAME
值的行,以确保有一个NULL等级,并在生成的j_names上使用DENSE_RANK()
来获取一个值来生成该字母从