SQL Server: вернуть пустое значение, если данные не существуют - PullRequest
0 голосов
/ 27 сентября 2018

У меня возникла проблема, и я прошу вашей помощи.У меня есть таблица с именем freefieldassignment, которая содержит некоторые данные, как показано ниже.

+-----------------+-------------------+--------+--------+
| Carrierobjectid | freefieldobjectid | value  |objectid|
+-----------------+-------------------+--------+--------+
|  90465009       | 75509             | D-AA   |90453004|
|  90465009       | 76378             | Yellow |90453062|
|  90465009       | 87395964          | ESCORT |90453072|
+-----------------+-------------------+--------+--------+

enter image description here

Последнее событие со значением ESCORTиногда может быть удален из таблицы из-за выбора пользователя из приложения, которое он использует.

Что я хочу сделать, это когда ESCORT удалено, вернуть пустое значение (или нулевое значение)

Я пытался написать запрос, используя NOT EXISTS, но он не работает.

Это выглядит так

select carrierobjectid, 
case 
     when [freefieldassignment].[value] = 'Escort' then 'Escort'
     when NOT EXISTS (SELECT [freefieldassignment].[value] FROM [freefieldassignment]
     WHERE [freefielddefinition].[objectid]= 87409935
     AND [freefieldassignment].[carrierobjectid] = 90465009) then 'NULL'

Кто-нибудь может помочь мне, пожалуйста?Это будет высоко ценится, спасибо.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Это моя тестовая таблица:

CREATE TABLE dbo.freefieldassignment (
 Carrierobjectid NVARCHAR(255),
 freefieldobjectid NVARCHAR(255),
 value NVARCHAR(255),
 objectid NVARCHAR(255)
)

INSERT INTO freefieldassignment (Carrierobjectid, freefieldobjectid, value, objectid)
VALUES
    ('1','2','N','2'),
    ('1','3','N','2'),
    ('1','3','N','3'),
    ('1','3','ESCORT','3')

И это мой запрос.Второй запрос будет генерировать строку, если не найдена строка ESCORT для значений, используемых в выражении group by:

SELECT Carrierobjectid, freefieldobjectid, value, objectid  FROM freefieldassignment
WHERE Carrierobjectid = 1 AND objectid = 2  
UNION ALL
SELECT Carrierobjectid, null, null, objectid 
FROM freefieldassignment
WHERE Carrierobjectid = 1 AND objectid = 2  
GROUP BY Carrierobjectid, objectid  
HAVING MAX(CASE WHEN value = 'ESCORT' THEN 1 ELSE 0 END) = 0

Результат:

Carrierobjectid | freefieldobjectid | value | objectid
1               | 2                 |   N   | 2
1               | 3                 |   N   | 2
1               | NULL              | NULL  | 2

Когда существует строка ESCORT, второй запрос от union не 'y вернуть данные:

SELECT Carrierobjectid, freefieldobjectid, value, objectid  FROM freefieldassignment
WHERE Carrierobjectid = 1 AND objectid = 3
UNION ALL
SELECT Carrierobjectid, null, null, objectid 
FROM freefieldassignment
WHERE Carrierobjectid = 1 AND objectid = 3  
GROUP BY Carrierobjectid, objectid  
HAVING MAX(CASE WHEN value = 'ESCORT' THEN 1 ELSE 0 END) = 0

Результат

Carrierobjectid | freefieldobjectid |   value  |    objectid
1               |   3               |   N      | 3
1               |   3               |   ESCORT | 3
0 голосов
/ 27 сентября 2018

Я думаю, что вы хотите, как показано ниже

 select carrierobjectid, 
case 
     when t.value = 'Escort' then t.value
     else null end as value
    FROM freefieldassignment  t
     WHERE t.objectid= 87409935
     AND t.carrierobjectid = 90465009
...