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

Count text values across columns in SQL using CASE WHEN expressions

我有一个 table 用于确定一个人的身份证号码是否存在于多个数据库中。如果 ID 仅存在于一个数据库中,那么我想添加另一列,将此人标记为 "UNIQUE";否则,它应该被标记为 "NOT 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

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

I have a table where I am determining whether a person's ID number exists across multiple databases.

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

让我假设真的有三个表,每个数据库一个。我只看到 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 表达式找到了适合我的解决方案。

基本上,我在已经创建的 table 中添加了一个额外的列。

查询如下所示:

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时,它是唯一的。