Запрос, чтобы проверить, существует ли запись, а также значение столбца в таблице является нулевым - PullRequest
0 голосов
/ 02 мая 2020

Учитывая значение для @InvId, которое идентифицирует запись Contact, которая затем может быть присоединена к записи UserAccount, например,

select *
from UserAccount UA
join Contact as c on UA.email = C.email and C.type = 'Director'
where C.InvId = @InvId

Я работаю над 2 сценарием ios, где мне нужно установить переменную флага @userExits, если

  1. в таблице Users существует соответствующая запись, а в записи UserAccount значение user_id равно NULL.
  2. a соответствующая запись не существует в таблице Users

Выполненный мной до сих пор запрос не выполняется для второго сценария.

declare @userExits int

if exists (
    select 1
    from UserAccount UA
    join Contact as c on UA.email = C.email and C.type = 'Director'
    where C.InvId = @InvId
    and exists (
        select 1
        from Users U
        where U.email = UA.email 
        and UA.user_id is null
    )
)
set @userExists = 1

Таблица пользователей:

 user_id | first_name | last_name | email           | telephone
---------------------------------------------------------------
 10      | John       |  Doe      | jdoe@gmail.com  | 123456
 11      | Joe        |  Dane     | jdane@gmail.com | 3456789

Таблица контактов:

 contact_id | inv_id | first_name | last_name | email          | type
-------------------------------------------------------------------------
 1          | 100    | john       | Doe       | jdoe@gmail.com | director

Таблица пользовательских учетных записей:

 s_id | first_name | last_name | email           | username        | user_id
----------------------------------------------------------------------------
 1    | john       | Doe       | jdoe@gmail.com  | jdoe@gmail.com  | 10
 2    | joe        | Dane      | jdane@gmail.com | jdane@gmail.com | null

Будут благодарны любые выводы.

1 Ответ

3 голосов
/ 02 мая 2020

Основываясь на ваших пояснениях в комментариях, я думаю вы хотите проверить следующие 2 условия:

Условие 1: User запись существует, но user_id равна нулю

select 1
from UserAccount UA
inner join Contact as C on UA.email = C.email and C.[type] = 'Director'
where C.InvId = @InvId
-- User Record exists
and exists (select 1 from Users U where U.email = UA.email)
-- user_id is null
and UA.[user_id] is null

Условие 2: User запись не существует

select 1
from UserAccount UA
inner join Contact as C on UA.email = C.email and C.[type] = 'Director'
where C.InvId = @InvId
-- User Record doesn't exist
and not exists (select 1 from Users U where U.email = UA.email)

Их можно объединить с OR для проверки обоих условий следующим образом:

declare @userExists int;

if exists (
  select 1
  from UserAccount UA
  inner join Contact as C on UA.email = C.email and C.[type] = 'Director'
  where C.InvId = @InvId
  and (
    (UA.[user_id] is null and exists (select 1 from Users U where U.email = UA.email))
    or not exists (select 1 from Users U where U.email = UA.email)
  )
)
begin
  set @userExists = 1;
end;

Кроме того, должна ли переменная действительно называться @userExists? Разве это не @userNotExists?

Примечание 1. Было бы полезно узнать, для чего вы тогда используете переменную @userExists - например, если вы используете ее для обновления записи, то, скорее всего, обновление и тестирование можно объединить в одно утверждение.

Примечание 2: Я должен предположить, что это только для целей тестирования? Потому что присоединение по адресу электронной почты не является рекомендуемой практикой - если вы не готовы наложить уникальное ограничение на адрес электронной почты, но некоторые люди все еще разделяют адрес электронной почты.

Примечание 3: Рекомендуется соблюдать согласованность в таблице указано, используете ли вы форму единственного или множественного числа. Вы использовали Users (множественное число) и Contact (единственное число).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...