首页 > 解决方案 > 当值基于另一列中的值时,如何将多个 SELECT 语句压缩为一个?

问题描述

从前端,XML 被发送到一个存储过程,该存储过程将其解析为一个具有两列的临时表:

 | DataName | DataValue |
1| blahblah | datadata  |
2|    ...   |    ...    |
3|    ...   |    ...    |
4|    ...   |    ...    |

从这个临时表中,我将 DataValue 列中的值设置为基于 DataName 列中的字符串的变量。例如:

SELECT @blahblah= IsNull(DataValue,0)
        FROM #XMLTempTable
        WHERE DataName = 'blahblah'

SELECT @userid = IsNull(DataValue,0)
        FROM #XMLTempTable
        WHERE DataName = 'userid'

SELECT @value = IsNull(DataValue,0)
        FROM #XMLTempTable
        WHERE DataName = 'value'

有没有更好的方法可以从临时表中选择值,而不是像我一样一次选择一个?

标签: sqlsql-servertsql

解决方案


如果您试图将这些键/值对“转换”为更有意义的行,那么这可能会对您有所帮助。但是请注意,假设 sql 表中的任何行顺序都是一个坏主意,尽管下面做出了这个假设。

CREATE TABLE #XMLTempTable(
   ID INT  NOT NULL IDENTITY PRIMARY KEY
  ,DataName  VARCHAR(20) NOT NULL
  ,DataValue VARCHAR(20) NOT NULL
);
INSERT INTO #XMLTempTable(DataName,DataValue) VALUES ('blahblah','blah-1');
INSERT INTO #XMLTempTable(DataName,DataValue) VALUES ('userid','user-1');
INSERT INTO #XMLTempTable(DataName,DataValue) VALUES ('value','value-1');
INSERT INTO #XMLTempTable(DataName,DataValue) VALUES ('blahblah','blah-2');
INSERT INTO #XMLTempTable(DataName,DataValue) VALUES ('userid','user-2');
INSERT INTO #XMLTempTable(DataName,DataValue) VALUES ('value','value-2');
GO
6 行受影响
SELECT 
  id
, blahblah = CASE WHEN  DataName = 'blahblah' THEN datavalue END
, userid = CASE WHEN  DataName = 'userid' THEN DataValue END
, value = CASE WHEN  DataName = 'value' THEN DataValue END
FROM #XMLTempTable
WHERE DataName in ('blahblah', 'userid', 'value')
GO
编号 | 废话| 用户名 | 价值  
-: | :------- | :----- | :------
 1 | 等等-1 |    |    
 2 |      | 用户 1 |    
 3 |      |    | 值-1
 4 | 等等-2 |    |    
 5 |      | 用户 2 |    
 6 |      |    | 价值 2
SELECT 
  (id + 2) / 3 as rowno
, max(CASE WHEN  DataName = 'blahblah' THEN datavalue END) as blahblah
, max(CASE WHEN  DataName = 'userid' THEN DataValue END) as userid
, max(CASE WHEN  DataName = 'value' THEN DataValue END) as datavalue
FROM #XMLTempTable
WHERE DataName in ('blahblah', 'userid', 'value')
GROUP BY
  (id + 2) / 3
GO
行号 | 废话| 用户名 | 数据值
----: | :------- | :----- | :--------
    1 | 等等-1 | 用户 1 | 值-1  
    2 | 等等-2 | 用户 2 | 价值 2  

db<>在这里摆弄


推荐阅读