我正在尝试编写一个查询,该查询需要根据结果仅等于1来查找3个WHERE值的ID号。
所以说我想找一个患者ID
,而我的where子句与firstname
,lastname
和DOB
相匹配。如果由于重复而有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
这就是我的目标。
谢谢你们
答案 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(*)
的存在自动意味着分组,现在,如果要引用基础行集的列,则只能访问其聚合值。