TSQL在没有找到行时返回预定义的行



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

的例子:

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 
表:

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

查找errorGroup很简单:

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

目标是一个查询,它将在发现错误时返回错误组和"default"找不到错误时的错误组。可以灵活地更改或修改数据来实现这一点。

在Linq中会是什么样子?

如果查询结果为空,可以使用T-SQL ISNULL系统函数返回一个预定义的常量值。

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

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

对于Linq,如果没有查询结果,可以使用DefaultIfEmpty设置查询的默认值。

如果您知道您总是只返回一行,那么最好的方法是使用coalesce——这将适用于所有版本和平台的SQL。

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

就SQL解决方案而言,这里是一种可能性。

我创建了这个表:

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,或者使用此查询

获得默认的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)

最新更新