Postgres: how to find absent users in DB

后端 未结 2 415
庸人自扰
庸人自扰 2021-01-29 09:44

Regular tasks when need to compare two db. Somene has sent me list of users, that should be in my database. 127 positions.

When I make SELECT * FROM users WHERE id

相关标签:
2条回答
  • 2021-01-29 10:34

    You can use an outer join to a values list:

    SELECT t.id 
    FROM (
      values 
         ('089477'),('089485'),('089417'),('089419'),('089416'),('089415'),('082513'),('087201'),('084769'),('083467'),('089498'),
         ('089394'),('085097'),('084818'),('089497'),('085208'),('082924'),('087204'),('087257'),('084708'),('0844187'),('089119'),
         ('088475'),('089448'),('084824'),('089436'),('085200'),('086431'),('089444'),('089479'),('089486'),('089460'),('089442'),
         ('089449'),('089413'),('089420'),('084917'),('084702'),('089433'),('089437'),('089443'),('081804'),('088813'),('089480'),
         ('089441'),('087184'),('081806'),('089435'),('081784'),('089401'),('089434'),('089423'),('089384'),('089422'),('089382'),
         ('089476'),('089473'),('089406'),('089461'),('089404'),('089409'),('089410'),('089412'),('089411'),('089396'),('089006'),
         ('089381'),('089379'),('089378'),('089397'),('089405'),('080006'),('089293'),('089478'),('084846'),('085210'),('089453'),
         ('089400'),('089452'),('089389'),('089383'),('089456'),('089402'),('089394'),('089418'),('089392'),('089387'),('089399'),
         ('089101'),('089117'),('080163'),('086021'),('081059'),('089414'),('089108'),('089288'),('089447'),('089446'),('089388'),
         ('089445'),('089386'),('089430'),('088828'),('088375'),('089407'),('083429'),('088645'),('089377'),('089342'),('089337'),
         ('089332'),('081635'),('089426'),('087197'),('089425'),('087767'),('088395'),('089341'),('089349'),('082114'),('082123'),
         ('084687'),('089333'),('089297'),('087371'),('089331')
    ) as t(id)
      left join users u on t.id = u.trader_systems_id 
    where u.trader_systems_id  is null;
    

    You can also return found and not found users:

    select t.id, 
           u.*,
    from (
       values ( .... )
    ) as t(id)
      left join users u on t.id = u.trader_systems_id;
    

    If you get a single string with comma separated IDs, you can use unnest() and string_to_array() to turn that in a proper set:

    select t.id, 
           u.*,
    from unnest(string_to_array('089477,089485,089417,089419,089416,..', ',',  null)) as t(id)
      left join users u on t.id = u.trader_systems_id;
    
    0 讨论(0)
  • 2021-01-29 10:36

    Based on your comment:

    select * from [given_list] EXCEPT select * from [already_in_database] 
    

    This will return the users who are in one list but not the other.

    Obviously, without more information it is hard to make use of primary keys, and so forth

    0 讨论(0)
提交回复
热议问题