【问题标题】:SQL Server: Return blank value when data not existsSQL Server:数据不存在时返回空白值
【发布时间】:2019-03-03 07:21:57
【问题描述】:

我遇到了一个问题,正在寻求您的帮助。我有一个名为 freefieldassignment 的表,其中包含一些数据,如下所示。

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

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'

有人可以帮我吗?将不胜感激,谢谢。

【问题讨论】:

  • 请将您的数据以表格形式包含在您的问题中,而不是图片,因为这样可以让他人更轻松地处理您的数据以帮助您。很少有人会考虑重新输入它!

标签: sql-server database sql-server-2017 not-exists


【解决方案1】:

这是我的测试表:

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')

这是我的查询。如果没有为 group by 子句中使用的值找到 ESCORT 行,则第二个查询将生成行:

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 行时,来自联合的第二个查询不会返回数据:

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

【讨论】:

    【解决方案2】:

    我想你想要像下面这样

     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
    

    【讨论】:

    • 不幸的是,事实并非如此。在这种情况下,它只显示一个空白表,列名仅可见。我相信使用 NOT EXISTS 应该可以完成这项工作。
    • @we_mor 你能添加预期的输出吗
    猜你喜欢
    • 2010-12-16
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多