TSQL return 未找到行时的预定义行

TSQL return predefined row when no rows found

使用 Microsoft SQL 服务器:有多个系统,每个系统都有一组错误(四位数字)映射到一个错误组(字符串)。有一个例外:如果错误字符串不在下面的列表中,它应该属于预定义的错误组。

示例:

System 1:
Error Group 1: 2001, 2003, 6538, 6540, 6542, 6544, 6546
Error Group 2: 2002, 6539, 6541, 6543, 6545, 6547, 6549
Error Group 3: 1000, 1001, 1002, 4001, 4007, 5001, 5002 AND ANYTHING ELSE!

System 2:
Error Group 1: 6016, 6533, 6540, 6542, 6544, 6546
Error Group 2: 6541, 6543, 6545, 6547, 6549 AND ANYTHING ELSE!
Error Group 3: 1002, 4001, 4007, 5001, 5002 

table:

SystemId (int): 1, 2, etc
ErrorGroup (string): "Error Type 1", ...
Error (int?): the four digit number 

查找错误组很简单:

SELECT ErrorGroup 
FROM table 
WHERE SystemId = 1 AND Error = 2002

目标是一个查询,当发现错误时将 return 错误组,未发现错误时将是“默认”错误组。可以灵活地更改或修改数据以实现此目的。

在 Linq 中会是什么样子?

如果查询结果为空,您可以使用 T-SQL ISNULL 系统函数 return 预定义常量值。

SELECT ISNULL(
    (SELECT ErrorGroup FROM table 
    WHERE SystemId = 1 AND Error = 2002), 
    'Default Group')

除了字符串文字,还可以使用另一个查询。

关于Linq,可以用DefaultIfEmpty设置查询没有结果的默认值

如果您知道您永远只会 return 一行,那么最好的方法是使用 coalesce —— 这将适用于 SQL.[=11= 的所有版本和平台]

SELECT COALESCE(ErrorGroup,'Default Group') AS ErrorGroup
FROM tablename
WHERE SystemId = 1 and Error = 2002

至于 SQL 的解决方案,这里是有可能的。

我将 table 创建为:

CREATE TABLE ErrorData (SystemID int NOT NULL,
                        ErrorGroupID int NOT NULL,
                        ErrorCode int NULL)

我根据您上面的信息添加了数据:

INSERT INTO ErrorData (SystemID, ErrorGroupID, ErrorCode)
values (1,1,3001),(1,1,3003),(1,1,6538),(1,1,6540),(1,1,6542),(1,1,6544),(1,1,6546),
       (1,2,2002),(1,2,6539),(1,2,6541),(1,2,6543),(1,2,6545),(1,2,6547),(1,2,6549), 
       (1,3,1000),(1,3,1001),(1,3,1002),(1,3,4007),(1,3,6542),(1,3,5001),(1,3,5002),
       (1,3,null),
       (2,1,6016),(2,1,6533),(2,1,6540),(2,1,6542),(2,1,6544),(2,1,6546),
       (2,2,6541),(2,2,6543),(2,2,6545),(2,2,6547),(2,2,6549), 
       (2,3,1002),(2,3,4001),(2,3,4007),(2,3,5001),(2,3,5002),
       (2,2,null)

您会注意到我为错误代码插入了一个 NULL 值以标识默认错误组

然后我可以查询数据并获得正确的 ErrorGroup,或者使用此查询的默认值

SELECT TOP 1 ErrorGroupID FROM ErrorData WHERE SystemID = 1 AND (ErrorCode = 3003 OR ErrorCode IS NULL) ORDER BY ISNULL(ErrorCode,99999)

如果我查询不存在的错误代码,我将获得默认错误组

SELECT TOP 1 ErrorGroupID FROM ErrorData WHERE SystemID = 1 AND (ErrorCode = 9999 OR ErrorCode ISNULL) ORDER BY ISNULL(ErrorCode,99999)