使用CASE WHEN表达式计算SQL中跨列的文本值



我有一个表,用于确定一个人的身份证号码是否存在于多个数据库中。如果ID只存在于一个数据库中,那么我想添加另一列,将此人标记为"UNIQUE";否则,应将其标记为"非唯一"。

到目前为止,我的查询是这样设置的:

/* CTE that creates a long column of all distinct PersonID's across three databases */
WITH cte as
(SELECT DISTINCT t1.*
FROM 
(SELECT PersonID FROM DB_1.dbo.Persons
UNION
SELECT PersonID FROM DB_2.dbo.Persons
UNION
SELECT PersonID FROM DB_3.dbo.Persons)
t1)
/* Use CASE WHEN statements to check if Person exists in three other tables in DB_1, DB_2, and DB_3 */ 
SELECT PersonID,
CASE WHEN PersonID IN (SELECT PersonID FROM DB_1.dbo.Table_1
UNION
SELECT PersonID FROM DB_1.dbo.Table_2
UNION 
SELECT PersonID FROM DB_1.dbo.Table_3)
THEN 'TRUE'
ELSE 'FALSE'
END AS IN_DB_1,
CASE WHEN PersonID IN (SELECT PersonID FROM DB_2.dbo.Table_1
UNION
SELECT PersonID FROM DB_2.dbo.Table_2
UNION 
SELECT PersonID FROM DB_2.dbo.Table_3)
THEN 'TRUE'
ELSE 'FALSE'
END AS IN_DB_2,
CASE WHEN PersonID IN (SELECT PersonID FROM DB_3.dbo.Table_1
UNION
SELECT PersonID FROM DB_3.dbo.Table_2
UNION 
SELECT PersonID FROM DB_3.dbo.Table_3)
THEN 'TRUE'
ELSE 'FALSE'
END AS IN_DB_3
FROM cte

结果如下:

PersonID   IN_DB_1    IN_DB_2    IN_DB_3
---------|----------|----------|----------|
001         TRUE       FALSE      FALSE
002         FALSE      TRUE       TRUE
003         TRUE       FALSE      FALSE
004         FALSE      TRUE       FALSE
005         TRUE       FALSE      TRUE

可以看出,PersonID编号001、003和004只出现在一个数据库中。我想添加一个名为"PID_UNIQUE"的第五列,它统计各列中"TRUE"文本值的数量,并指定该人是否唯一。

它应该是这样的:

PersonID   IN_DB_1    IN_DB_2    IN_DB_3    PID_UNIQUE
---------|----------|----------|----------|-----------|
001         TRUE       FALSE      FALSE      UNIQUE
002         FALSE      TRUE       TRUE      NOT UNIQUE
003         TRUE       FALSE      FALSE      UNIQUE
004         FALSE      TRUE       FALSE      UNIQUE
005         TRUE       FALSE      TRUE      NOT UNIQUE

我认为这将使用另一个CASE WHEN表达式来设置。我有点纠结于如何写出这三个"IN_DB_no"列。

我试过这个:

CASE WHEN COUNT('TRUE') = 1
THEN 'UNIQUE'
ELSE 'NOT UNIQUE'
END AS PID_UNIQUE

然而,它返回了一个列,其中所有记录都是唯一的,这不是我所需要的。

我有一个表,用于确定一个人的身份证号码是否存在于多个数据库中。

您的示例查询引用的表比这表明的要多得多。因此,这似乎比必要的要复杂得多。

让我假设实际上有三个表,每个数据库中有一个表。我只看到UNION ALL:之后的聚合

SELECT PersonID, MAX(in_1), MAX(in_2), MAX(in_3),
(CASE WHEN MAX(in_1) + MAX(in_2) + MAX(in_3) = 1 THEN 'UNIQUE'
ELSE 'NOT UNIQUE'
END) as pid_Unique
FROM ((SELECT DISTINCT PersonID, 1 as in_1, 0 as in_2, 0 as in_3
FROM DB_1.dbo.Persons
) UNION ALL
(SELECT DISTINCT PersonID, 0 as in_1, 1 as in_2, 0 as in_3
FROM DB_2.dbo.Persons
) UNION ALL
(SELECT DISTINCT PersonID, 0 as in_1, 0 as in_2, 1 as in_3
FROM DB_3.dbo.Persons
)
) p
GROUP BY PersonId;

我使用CROSS APPLY运算符和CASE/WHEN表达式找到了一个适合我的解决方案。

基本上,我在已经制作的表中添加了一个额外的列。

查询如下:

SELECT * FROM My_New_DB.dbo.My_New_Tbl
CROSS APPLY (
SELECT CASE WHEN 1 = (SELECT COUNT(*)
FROM (VALUES (IN_DB_1), (IN_DB_2), (IN_DB_3)) C (Val)
WHERE Val = 'TRUE')
THEN 'UNIQUE'
ELSE 'NOT UNIQUE'
END AS UNIQUE_ID
) A

简单地说,当1=1时,它是唯一的。

相关内容

  • 没有找到相关文章

最新更新