如果count等于1,请选择ID

时间:2014-08-01 04:22:03

标签: sql sql-server

我正在尝试编写一个查询,该查询需要根据结果仅等于1来查找3个WHERE值的ID号。

所以说我想找一个患者ID,而我的where子句与firstnamelastnameDOB相匹配。如果由于重复而有2个结果,我需要输出为NIL,否则它应该返回患者ID。

if(select count(*)
from patient
where last_name = 'JAMES' 
and first_name = 'JONES' 
and birth_DtTM = '1980-01-01') > 1
print 'NULL' else return Pat_ID1

这就是我的目标。

谢谢你们

3 个答案:

答案 0 :(得分:1)

select case when  count(*)> 1
then 'NULL' else Pat_ID1 end 
from patient
where last_name = 'JAMES' 
and first_name = 'JONES' 
and birth_DtTM = '1980-01-01'
group by Pat_ID1

答案 1 :(得分:0)

尝试以下。

;WITH CTE(Pat_ID1,last_name,first_name,birth_DtTM,dup_rows)
as
(
    SELECT Pat_ID1,last_name,first_name,birth_DtTM,ROW_NUMBER() OVER(PARTITION BY last_name,first_name,birth_DtTM ORDER BY Pat_ID1) AS dup_rows FROM patient
)
SELECT 
case when dup_rows>1 then null
            when dup_rows=1 then Pat_ID1
            end
 FROM CTE

答案 2 :(得分:0)

你可以这样做:

SELECT
  PatientID = CASE COUNT(*) WHEN 1 THEN MAX(Pat_ID1) END
FROM
  patient
WHERE
  last_name = 'JAMES' 
  AND first_name = 'JONES' 
  AND birth_DtTM = '1980-01-01'
;

CASE表达式将评估与请求匹配的单个Pat_ID1或NULL(如果COUNT(*)不是1)。

如您所见,Pat_ID1值是在聚合函数的帮助下获得的(顺便说一下,您也可以使用MIN而不是MAX)。这是因为查询中COUNT(*)的存在自动意味着分组,现在,如果要引用基础行集的列,则只能访问其聚合值。