小提琴示例:http://sqlfiddle.com/#!3/419ec/ 3
2008 年的 SQL 服务器。
我想知道是否有人可以使用替换功能和取消透视功能向我解释下面的选择查询中发生了什么。我是 sql 的新手,我不明白这种查询的逻辑(非规范化表)。
CREATE TABLE TableB
([date] datetime, [Id] int, [name] varchar(3), [blah1] varchar(4), [hour1] int, [hour2] int, [hour3] int, [hour4] int)
;
INSERT INTO TableB
([date], [Id], [name], [blah1], [hour1], [hour2], [hour3], [hour4])
VALUES
('2013-04-01 00:00:00', 1, 'Jim', 'test', 129, 343, 54, 89),
('2013-04-01 00:00:00', 2, 'Bob', 'rewe', 45, 6, 45, 2),
('2013-04-02 00:00:00', 3, 'Joe', 'fdf', 7, 8, 4, 3)
选择查询:
select date,
id,
name,
replace(MightMouse, 'hour', '') hour,
observationvalue
from tableB
unpivot
(
observationvalue
for MightMouse in (hour1, hour2, hour3, hour4)
) unpiv
我认为replace函数的用法如下:
REPLACE ( string_expression , string_pattern , string_replacement )
string_expression
http://msdn.microsoft.com/en-us/library/ms186862.aspx
根据replace
函数的定义,string_expression 是正在其中搜索子字符串的字符串(子字符串可以是完整字符串)。例如,
replace('mynameisjohn', 'john', '')
john
这将在 string_expression 中搜索子字符串mynameisjohn
并将其替换为空字符串,从而生成一个等于 的字符串mynameis
。
但在上面的例子中,我不明白是什么MightyMouse
。原表中没有MightyMouse
。我也不知道 unpivot 部分如何像在执行流程中那样适合查询。
例如,如果这是 python,那么代码的逻辑就会很直观。使用 SQL,您似乎可以构建丑陋的查询,并且从 sql 的角度来看,一切都很好。但从用户的角度来看,可能很难分解查询代码的不同部分中发生的事情。