SQL将每一行与参考行进行比较

时间:2018-11-01 11:04:01

标签: sql postgresql

我正在尝试将select语句的每一行与参考行进行比较。

因此,要将其放在上下文中,我想找到参考行,该行是我们其中一位用户的帐户详细信息。

SELECT id, first_name
FROM account
WHERE id = '100'

将返回有关用户的信息

然后我想运行SELECT语句以返回所有用户-非常简单

SELECT id,first_name
FROM account

对于每一行,我想将first_name与参考行进行比较。如果相同,则返回“ 1”;如果不同,则返回“ 0”

如果我输入要比较的值,例如“ Paul”,我就可以这样做

SELECT id,first_name,
CASE
    WHEN first_name = 'Paul' THEN '1'
    ELSE '0'
END
FROM account

但是显然我想用上面引用行中的first_name代替Paul。

我的谷歌搜索建议我先声明一个变量,然后再使用SELECT INTO变量

DO $$;
Declare
       @reference_first_name   text;
BEGIN
SELECT first_name
into @reference_first_name
FROM account
WHERE id = ‘100’
END;

但是我似乎无法将它们放在一起。

然后更进一步,是否可以引用多个列?

3 个答案:

答案 0 :(得分:1)

您可以在子查询中简单地做到这一点:

demo:db<>fiddle

SELECT 
    id, 
    first_name, 
    CASE 
        WHEN (SELECT first_name FROM users WHERE id = 100) = first_name THEN 1 
        ELSE 0
    END
FROM users;

其他方式使用CTE或JOIN(有关这些版本,请参见小提琴)

答案 1 :(得分:1)

这里还有一个使用outer join的选项:

select a.id, a.first_name, case when a.first_name = b.first_name then 1 else 0 end
from account a
    left join account b on b.id = 100

答案 2 :(得分:0)

correlated subquery用作:

select a.id, a.first_name,
        ( select count(*) 
            from personnel p 
           where p.id = 100 
             and upper(p.first_name) = upper(a.first_name) ) as flag
  from account a;

提供一个名为personnel的表,并为所有比较固定一个ID。

Rextester Demo