2017-10-20 94 views
0

我正在处理ID类型的逻辑,其中大约有20个,我在查询中的where子句下执行IDType = COALESCE(1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19))合并SQL函数的参数限制?

1)对于类型1和12的记录。当满足1时,忽略12,我只看到一个结果(显然前两个)。

2)记录类型ID为6,8,11。我期望它会按照Coalesce中指定的顺序选择6并删除8和11个类型,但这不起作用。有趣的是,我没有找到这个记录的任何结果。

Coalesce函数中的参数数量是有限制的,因为在第一种情况下它正在拾取1而忽略12,第二种情况下它没有拾取任何ID类型。请帮助#NewToSQL

+0

请标记你的rdbms(sql-server,oracle,postgres等) – Igor

+3

COALESCE的结果(1,2,4,5,6,7,8,9,10,11,12,13,15,16,17 ,18,19)始终为1. coalesce返回第一个非空。 – KeithL

回答

2

如果你需要拿起“第一” IDType你可以用窗函数的一个做到这一点,说ROW_NUMBER

SELECT * FROM 
(
SELECT t.* , ROW_NUMBER() OVER (ORDER BY IDType) rn 
FROM table1 t 
WHERE IDType IN (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19) 
) a 
WHERE rn =1; 

更新添加partition by employee_id(假设表有employee_id场)

SELECT * FROM 
(
SELECT t.* , ROW_NUMBER() OVER (PARTITION BY t.employee_id ORDER BY IDType) rn 
FROM table1 t 
WHERE IDType IN (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19) 
) a 
WHERE rn =1; 
+0

这是做什么是为所有记录编号的所有ID类型,但只选择(显然)行号1.因此,如果有10名雇员25 ID。对结果集进行编号1到25,并对行号1进行筛选并输出1条记录。我想要的是返回10个员工,但只有一个ID类型(假设他们都有1个ID类型,他们都返回结果集),对吗? – Sanj

+0

@Sanj:更新。我想你应该提到问题中的所有要求,除非你写下来,否则不可能猜出你需要什么。 – a1ex07

+0

您的更新答案是我正在寻找的东西,非常棒的学习! – Sanj

1

在SQL Server COALESCE中没有关于参数数量的明确限制。

你读到你的问题听起来像一个逻辑问题,你必须使用Case (Transact-SQL)解决。

COALESCE (Transact-SQL)是解决null问题。

+0

可能是你是对的,我使用了错误的功能。在我的情况下,当我想忽略剩余的ID类型时,更好的方法是什么?说第二种情况,其中6是可用的,我想忽略8和11类型。 – Sanj

+0

@Sanj你能否提供一张表格来显示Id和预期结果?我无法找到你的输入的一个很好的解决方案。 –