【发布时间】:2016-08-03 19:00:05
【问题描述】:
我有一组 CODE_1-10 列,其中包含诊断代码。我想创建一组变量 CODE_GROUP_1-17,它们指示某些特定诊断代码集中的一个是否与任何 CODE_1-10 变量匹配。例如,如果 CODE_1-10 中的任何一个匹配“123”或“456”,则 CODE_GROUP_1 = 1,如果 CODE_1-10 中的任何一个匹配“789”、“111”、“333”、“444”或“,则 CODE_GROUP_2 = 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 ('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 数组并输出一组列 CODE_GROUP_1-17 的 CLR UDF?
【问题讨论】:
-
SQL Server 中没有数组这样的东西。您是否考虑过表值参数 (TVP)?您可以从应用程序(例如 DataTable)中传入结构化数据,而无需进行任何混乱的解构/重建。
-
如何构建表值参数以包含一个包含 CODE_1-10 的小表,而无需复制粘贴“VALUES(...) ...”17 次不同的时间?
-
好吧,假设您已经有一个表类型并声明了一个名为
@tvp的局部变量,您可以说:;WITH x AS (SELECT TOP (10) rn = ROW_NUMBER() OVER (ORDER BY number) FROM master.dbo.spt_values) INSERT @tvp(col) SELECT 'CODE_' + RTRIM(rn) FROM x;如果您想查看它的作用,请在没有 @987654324 的情况下运行它@ 少量。我只提到了 TVP,因为它听起来就像您的值数组应该来自应用程序,并且您在这里对其进行硬编码以进行演示。 -
我会调查的。我的值数组是一个巨大的表中的列,名为 CODE_1-10。我想将此映射函数应用于每一行,并将结果输出到 select 语句中的列。
标签: sql sql-server tsql udf