SQL 服务器 UDF 数组输入和输出
SQL Server UDF array inputs and outputs
我有一组列 CODE_1-10,其中包含诊断代码。我想创建一组变量 CODE_GROUP_1-17,它指示某些特定诊断代码组中的一个是否与任何 CODE_1-10 变量匹配。例如,如果 CODE_1-10 中的任何一个匹配“123”或“456”,则 CODE_GROUP_1 = 1,如果 CODE_1-10 中的任何一个匹配“789”,则 CODE_GROUP_2 = 1, 111'、'333'、'444' 或 'foo'.
这是一个示例,说明如何使用值构造函数执行此操作。
CASE WHEN (SELECT count(value.val)
FROM (VALUES (CODE_1)
, (CODE_2)
, (CODE_3)
, (CODE_4)
, (CODE_5)
, (CODE_6)
, (CODE_7)
, (CODE_8)
, (CODE_9)
, (CODE_10)
) AS value(val)
WHERE value.val in ('123', '456')
) > 0 THEN 1 ELSE 0 END AS CODE_GROUP_1,
CASE WHEN (SELECT count(value.val)
FROM (VALUES (CODE_1)
, (CODE_2)
, (CODE_3)
, (CODE_4)
, (CODE_5)
, (CODE_6)
, (CODE_7)
, (CODE_8)
, (CODE_9)
, (CODE_10)
) AS value(val)
WHERE value.val in ('789','111','333','444','foo')
) > 0 THEN 1 ELSE 0 END AS CODE_GROUP_2
我想知道是否有另一种更有效的方法。有没有办法制作一个 CLR UDF,它采用 CODE_1-10 数组并输出一组列 CODE_GROUP_1-17?
你能创建 2 个新的 table 并将列附加为行吗?因此,如果您需要保留 1-10 值和 dx 代码以及您需要的任何关键字段,一个 table 将是带有源列的 dxCode,另一个 table 将是带有您的 dxGroup 17 个组,源组 ID(如果需要)和目标 dx 值。
然后要确定哪些代码在哪些组中,您可以加入您的 dx 字段。
您至少可以像这样避免重复 FROM (VALUES ...)
:
SELECT
CODE_GROUP_1 = COUNT(DISTINCT CASE WHEN val IN ('123', '456') THEN 1 END),
CODE_GROUP_2 = COUNT(DISTINCT CASE WHEN val IN ('789','111','333','444','foo') THEN 1 END),
...
FROM
(
VALUES
(CODE_1),
(CODE_2),
(CODE_3),
(CODE_4),
(CODE_5),
(CODE_6),
(CODE_7),
(CODE_8),
(CODE_9),
(CODE_10)
) AS value(val)
如果CODE_1
、CODE_2
等是列名,可以用上面的查询作为CROSS APPLY中的派生table:
SELECT
...
FROM
dbo.atable -- table containing CODE_1, CODE_2 etc.
CROSS APPLY
(
SELECT ... -- the above query
) AS x
;
我有一组列 CODE_1-10,其中包含诊断代码。我想创建一组变量 CODE_GROUP_1-17,它指示某些特定诊断代码组中的一个是否与任何 CODE_1-10 变量匹配。例如,如果 CODE_1-10 中的任何一个匹配“123”或“456”,则 CODE_GROUP_1 = 1,如果 CODE_1-10 中的任何一个匹配“789”,则 CODE_GROUP_2 = 1, 111'、'333'、'444' 或 'foo'.
这是一个示例,说明如何使用值构造函数执行此操作。
CASE WHEN (SELECT count(value.val)
FROM (VALUES (CODE_1)
, (CODE_2)
, (CODE_3)
, (CODE_4)
, (CODE_5)
, (CODE_6)
, (CODE_7)
, (CODE_8)
, (CODE_9)
, (CODE_10)
) AS value(val)
WHERE value.val in ('123', '456')
) > 0 THEN 1 ELSE 0 END AS CODE_GROUP_1,
CASE WHEN (SELECT count(value.val)
FROM (VALUES (CODE_1)
, (CODE_2)
, (CODE_3)
, (CODE_4)
, (CODE_5)
, (CODE_6)
, (CODE_7)
, (CODE_8)
, (CODE_9)
, (CODE_10)
) AS value(val)
WHERE value.val in ('789','111','333','444','foo')
) > 0 THEN 1 ELSE 0 END AS CODE_GROUP_2
我想知道是否有另一种更有效的方法。有没有办法制作一个 CLR UDF,它采用 CODE_1-10 数组并输出一组列 CODE_GROUP_1-17?
你能创建 2 个新的 table 并将列附加为行吗?因此,如果您需要保留 1-10 值和 dx 代码以及您需要的任何关键字段,一个 table 将是带有源列的 dxCode,另一个 table 将是带有您的 dxGroup 17 个组,源组 ID(如果需要)和目标 dx 值。 然后要确定哪些代码在哪些组中,您可以加入您的 dx 字段。
您至少可以像这样避免重复 FROM (VALUES ...)
:
SELECT
CODE_GROUP_1 = COUNT(DISTINCT CASE WHEN val IN ('123', '456') THEN 1 END),
CODE_GROUP_2 = COUNT(DISTINCT CASE WHEN val IN ('789','111','333','444','foo') THEN 1 END),
...
FROM
(
VALUES
(CODE_1),
(CODE_2),
(CODE_3),
(CODE_4),
(CODE_5),
(CODE_6),
(CODE_7),
(CODE_8),
(CODE_9),
(CODE_10)
) AS value(val)
如果CODE_1
、CODE_2
等是列名,可以用上面的查询作为CROSS APPLY中的派生table:
SELECT
...
FROM
dbo.atable -- table containing CODE_1, CODE_2 etc.
CROSS APPLY
(
SELECT ... -- the above query
) AS x
;