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)
使用 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)