SQL Server UDF数组输入和输出

时间:2016-08-03 19:00:06

标签: sql sql-server tsql udf

我有一组CODE_1-10列,其中包含诊断代码。我想创建一组变量CODE_GROUP_1-17,它们指示某些特定诊断代码集中的一个是否与任何CODE_1-10变量匹配。例如,CODE_GROUP_1 = 1,如果CODE_1-10中的任何一个匹配' 123'或者' 456'和CODE_GROUP_2 = 1如果任何CODE_1-10匹配' 789'' 111'' 333',&# 39; 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

我想知道是否还有另一种方法可以提高效率。有没有办法制作一个带有CODE_1-10数组的CLR UDF,并输出一组CODE_GROUP_1-17列?

2 个答案:

答案 0 :(得分:2)

你至少可以避免重复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中将上述查询用作派生表:

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

答案 1 :(得分:0)

您可以创建2个新表,并将列作为行附加吗?因此,如果您需要保留1-10值和dx代码以及您需要的任何关键字段,那么一个表将是带有源列的dxCode,另一个表将是包含17个组的dxGroup,如果您需要源组ID需要它,以及你的目标dx值。 然后,要确定哪些代码在哪些组中,您可以加入dx字段。