2015-10-06 53 views
0

我有一个场景,如果它为空,我需要自动生成列的值。在SQL Server中填充自动递增INT 5数字值的情况下

例:employeeDetails

empName empId empExtension 
    A  101 null 
    B  102 987 
    C  103 986 
    D  104 null 
    E  105 null 

employeeDepartment

deptName empId 
    HR  101 
    ADMIN 102 
    IT  103 
    IT  104 
    IT  105 

查询

SELECT 
    empdt.empId, empdprt.deptName, empdt.empExtension 
FROM 
    employeeDetails empdt 
LEFT JOIN 
    employeeDepartment empdprt ON empdt.empId = empdprt.empId 

输出:

empId deptName empExtension 
101 HR   null 
102 ADMIN  987 
103 IT   986 
104 IT   null 
105 IT   null 

现在我的问题是我要插入一些虚拟值代替零和自动递增,从5位数INT编号开始

预期输出:

empId  deptName empExtension 
101 HR   12345 
102 ADMIN  987 
103 IT   986 
104 IT   12346 
105 IT   12347 

约束:我不能改变现有的表结构或任何列的数据类型。

回答

1

你应该能够做到这一点的CTE抢ROW_NUMBER,然后COALESCE只使用数字,该值为NULL:

WITH cte AS(
    SELECT empId, empExtension, ROW_NUMBER() OVER(ORDER BY empExtension, empId) rn 
    FROM employeeDetails 
) 
SELECT cte.empId, deptName, COALESCE(empExtension, rn + 12344) empExtension 
FROM cte LEFT JOIN employeeDepartment 
    ON cte.empID = employeeDepartment.empID 
ORDER BY cte.empId 

这里是一个SQLFiddle

+0

完美:)谢谢你一吨 –

0

只是一个想法,你可以保存查询到临时表

SELECT empdt.empId, empdprt.deptName, empdt.empExtension 
INTO #TempEmployee 
FROM employeeDetails empdt 
LEFT JOIN employeeDepartment empdprt 
ON empdt.empId = empdprt.empId 

而这只是做#TempEmployee的更新后的结果呢?

1

如果你只是想为那些empExtension列值的唯一的随机5位数字为空,那么

查询

;with cte as 
(
    select rn = row_number() over 
    (
     order by empId 
    ),* 
    from employeeDetails 
) 
select t1.empId,t2.deptName, 
case when t1.empExtension is null 
then t1.rn + (convert(numeric(5,0),rand() * 20000) + 10000) 
else t1.empExtension end as empExtension 
from cte t1 
left join employeeDepartment t2 
on t1.empId = t2.empId; 

SQL Fiddle

+0

嗨Ullas,你能帮我从12345等开始产生序列。 ? –

+0

非常感谢:)很棒 –

1
declare @rand int = (rand()* 12345); 
SELECT empdt.empId, empdprt.deptName, 
     isnull(empdt.empExtension,row_number() over(order by empdt.empId)[email protected]) 
    FROM employeeDetails empdt 
LEFT JOIN employeeDepartment empdprt 
    ON empdt.empId = empdprt.empId 

柜面empExtension ,得到row_number +一个随机数。

+0

简单易懂:) great Osama Orabi –

相关问题