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_1CODE_2等是列名,可以用上面的查询作为CROSS APPLY中的派生table:

SELECT
  ...
FROM
  dbo.atable  -- table containing CODE_1, CODE_2 etc.
  CROSS APPLY
  (
    SELECT ...  -- the above query
  ) AS x
;