目标表的Oracle脚本

时间:2014-07-11 10:17:06

标签: sql oracle

您好我有以下要求

表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,如果源值不在目标表中,那么它将获得一个新的从列表中输入。

我能做到吗?

2 个答案:

答案 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()来获取一个值来生成该字母从

An SQLfiddle to test with