sql - 当值基于另一列中的值时,如何将多个 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'
有没有更好的方法可以从临时表中选择值,而不是像我一样一次选择一个?
解决方案
如果您试图将这些键/值对“转换”为更有意义的行,那么这可能会对您有所帮助。但是请注意,假设 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<>在这里摆弄
推荐阅读
- javascript - 上传的图片不显示。我只是从其他图片的数组/列表中获取它的链接,即使我将它的值推送到该列表/数组
- node.js - 错误 - 创建服务时回退重新启动失败的容器
- r - 使用 scale_fill_brewer 在 ggplot 上更改颜色的问题
- facebook - nginx fbclid 从 url 中删除
- javascript - 使用 HashRouter 时以编程方式导航
- python-3.x - 如何修复不遵循配置的画布大小
- r - 如何计算文本但不包括括号中的单词?
- r - 从具有 R 的非对称(有向)邻接矩阵中找到所有节点的度数(中心性)
- ruby-on-rails - 如何修复 Ruby 中的“OpenSSL::SSL::SSLError”错误?
- string - 范围内的算术运算顺序问题