ВЫБЕРИТЕ столбец со значением «если Id существует в другой таблице / представлении» - PullRequest
0 голосов
/ 15 января 2020

Это то, что я хочу:

SELECT a.*,
    IIF(l.Id IS NOT NULL,
        CAST(1 AS BIT),
        CAST(0 AS BIT)) AS IsLatest
  FROM [A] a
  LEFT JOIN [LatestA] l on (l.Id = a.Id)

LatestA - это представление, содержащее только самые последние A.

Однако я чувствую себя как IIF(..., TRUE, FALSE) глупо Есть ли лучший способ проверки существования Id в LatestA?

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Ваш запрос в порядке. Некоторые СУБД имеют ярлыки для преобразования результата предиката в логическое значение, но не SQL Сервер.

Вы можете слегка упростить его следующим образом:

SELECT 
    a.*,
    CASE WHEN l.Id IS NULL THEN 0 ELSE 1 END AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on l.Id = a.Id

Обратите внимание, что я вместо функции IIF() использовалось выражение CASE: я предпочитаю, потому что оно стандартное SQL. Я также считаю, что здесь проще использовать IS NULL, чем IS NOT NULL.

Если вы действительно хотите вернуть BIT по какой-то причине, то:

SELECT 
    a.*,
    CAST(CASE WHEN l.Id IS NULL THEN 0 ELSE 1 END AS BIT) AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on l.Id = a.Id
1 голос
/ 15 января 2020

T- SQL не позволяет использовать логические выражения в качестве целочисленных значений (как это делает MySQL), поскольку у него есть третье возможное логическое значение (UNKNOWN), поэтому вы застряли с чем-то вроде того, что у вас есть , Вы можете несколько упростить это:

SELECT a.*,
       CAST(IIF(l.Id IS NOT NULL, 1, 0) AS BIT) AS IsLatest
FROM [A] a
LEFT JOIN [LatestA] l on (l.Id = a.Id)
0 голосов
/ 15 января 2020

вы можете использовать оператор EXISTS, он используется для проверки существования записи

if exists ([query for ID]) BEGIN [Quert from another table] END

...