Sql 将键值行视为多列单行
将参数x、y、z存储为键值 您希望对这些参数执行表达式z=x+y。表达式存储在另一个表中 您希望尽可能简单地从表达式生成SQL查询 如何将这些参数值视为具有列(x、y、z)的单行,以启用表达式的执行Sql 将键值行视为多列单行,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,将参数x、y、z存储为键值 您希望对这些参数执行表达式z=x+y。表达式存储在另一个表中 您希望尽可能简单地从表达式生成SQL查询 如何将这些参数值视为具有列(x、y、z)的单行,以启用表达式的执行 SELECT * INTO #key_values FROM ( SELECT 'x' AS mykey, 2 AS myvalue UNION ALL SELECT 'y', 5 UNION ALL SELECT 'z', 0 ) a; 使用公共表表达式将
SELECT *
INTO #key_values
FROM
(
SELECT 'x' AS mykey, 2 AS myvalue
UNION ALL
SELECT 'y', 5
UNION ALL
SELECT 'z', 0
) a;
使用公共表表达式将3行转换为单个3列行,并更新以运行表达式。因此,建议的解决方案是一个可更新的cte
WITH myvalues(x,y,z) AS (
SELECT x.myvalue, y.myvalue, z.myvalue
FROM #key_values AS x
JOIN #key_values AS y ON y.mykey='y' AND x.mykey='x'
JOIN #key_values AS z ON z.mykey='z'
)
UPDATE myvalues SET z=x+y;
SELECT myvalue FROM #key_values WHERE mykey='z';
这对
PIVOT
操作员来说非常重要:
;WITH Inputs AS
(
SELECT 'x' AS mykey, 2 AS myvalue
UNION ALL
SELECT 'y', 5
UNION ALL
SELECT 'z', 0
)
SELECT
U.x,
U.y,
U.z,
Result = U.x + U.y
FROM
Inputs AS I
PIVOT (
MAX(I.myvalue) FOR I.mykey IN (x, y, z)
) AS U
结果:
x y z Result
2 5 0 7
您可以使用SELECT
中的数据透视列构建任意表达式
如果要更新
z
记录,则必须重新连接到基础表,因为在应用PIVOT
后,您将无法访问原始表
IF OBJECT_ID('tempdb..#Input') IS NOT NULL
DROP TABLE #Input
CREATE TABLE #Input (
mykey VARCHAR(10),
myvalue INT)
INSERT INTO #Input (
mykey,
myvalue)
VALUES
('x', 2),
('y', 5),
('z', 0)
UPDATE I SET
myvalue = R.Result
FROM
#Input AS I
CROSS APPLY (
SELECT
Result = x + y
FROM
#Input AS I
PIVOT (MAX(I.myvalue) FOR I.mykey IN (x, y, z)) AS U
) AS R
WHERE
I.mykey = 'z'
“表达式以输入数据的形式提供。”这是什么意思?更改为“表达式存储在另一个表中”。我想从表达式生成一个查询。它实际上是一个动态SQL,使用表达式作为输入生成查询字符串。确实相关。想知道我如何可以毫无痛苦地更新z。将Result=U.x+U.y替换为Result=x+y。是否可以删除“For I.mykey IN(x,y,z)”的枢轴约束?我们能告诉它创建所有可能的列吗?@LudovicAubert然后你必须做一个动态透视(使用动态SQL)。有关PIVOT/UNPIVOT的完整示例