Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql:-查询中的replace和unpivot函数_Sql_Sql Server_Replace_Unpivot - Fatal编程技术网

sql:-查询中的replace和unpivot函数

sql:-查询中的replace和unpivot函数,sql,sql-server,replace,unpivot,Sql,Sql Server,Replace,Unpivot,这里的小提琴示例: SQL server 2008 我想知道是否有人可以向我解释一下下面使用replace函数和unpivot函数的select查询中发生了什么。我是sql的新手,我不理解这种类型查询的逻辑(表的反规范化) 选择查询: select date, id, name, replace(MightMouse, 'hour', '') hour, observationvalue from tableB unpivot ( observationvalue f

这里的小提琴示例:

SQL server 2008

我想知道是否有人可以向我解释一下下面使用replace函数和unpivot函数的select查询中发生了什么。我是sql的新手,我不理解这种类型查询的逻辑(表的反规范化)

选择查询:

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

根据
replace
函数的定义,string_表达式是搜索子字符串的字符串(子字符串可以是完整字符串)。比如说,

replace('mynameisjohn', 'john', '')
这将在string_expression
mynameisjohn
中搜索子字符串
john
,并将其替换为空字符串,从而生成一个等于
mynameis
的字符串

但是在上面的例子中,我不明白什么是
MightyMouse
。原始表中没有
MightyMouse
。我也不知道unpivot部分如何与执行流一样适合查询


例如,如果这是python,那么代码的逻辑流是直观的。使用SQL,您似乎可以构建难看的查询,从SQL的角度来看,一切正常。但是,从用户的角度来看,分解查询代码不同部分中发生的事情可能很困难

“MightMouse”是新列的名称。基本上,你是把所有的小时栏目都合并成一个栏目。“for MightMouse in…”正在调用列MightMouse。因此,您将用空字符串替换新列中的文字字符串“hour”。

Unpivot对您案例中指定的每一列使用嵌套的左外联接

 (hour1, hour2, hour3, hour4)
select replace('hour1','hour','')
select replace('hour2','hour','')
select replace('hour3','hour','')
这些列名也是结果的一部分,在您的案例中称为MightMouse

 (hour1, hour2, hour3, hour4)
select replace('hour1','hour','')
select replace('hour2','hour','')
select replace('hour3','hour','')
换句话说,相同的查询可以这样编写

select a.date,a.id, 
  a.name,replace('hour1', 'hour', '') as hour ,a.hour1 as observationvalue
from TableB a
left outer join TableB b
on a.hour1=b.hour1
where a.hour1 is not null
union

select a.date,a.id, 
  a.name,replace('hour2', 'hour', '') as hour ,a.hour2 as observationvalue
from TableB a
left outer join TableB b
on a.hour2=b.hour2
where a.hour2 is not null
union
select a.date,a.id, 
  a.name,replace('hou3', 'hour', '') as hour ,a.hour3 as observationvalue
from TableB a
left outer join TableB b
on a.hour3=b.hour3
where a.hour3 is not null
union
select a.date,a.id, 
  a.name,replace('hour4', 'hour', '') as hour ,a.hour4 as observationvalue
from TableB a
left outer join TableB b
on a.hour4=b.hour4
where a.hour4 is not null

UNPIVOT
是一个表运算符,它在它前面的表上操作:

tableName UNPIVOT (<unpivot-expression>)
变为以下行:

observationvalue MightMouse
129              hour1
343              hour2
 54              hour3
 89              hour4
(当然,还有其他相应的列值)

希望,这也清楚地说明了替换正在做什么以及为什么它会起作用


至于有效的(*)执行顺序:在SQL查询中总是首先执行
FROM
子句,然后执行
WHERE
子句。
SELECT
子句(列列表和列表达式)几乎是最后一个,而
orderby
子句通常是最后一个(有一些MS特定的例外)


(*-这只是执行的“有效”/“逻辑”顺序。SQL引擎可以按照它想要的任何实际顺序执行操作,只要它具有与此顺序相同的逻辑效果)

Dave感谢您的评论。因此,我创建了一个新的列
MightMouse
,它没有出现在最终的查询输出中,但用于处理查询?然后,它将所有的小时列涂抹成一个名为
hour
的列。我仍然不理解查询的流程。先执行哪一部分?是先执行unpivot吗?谢谢你的评论。我很感激。但是a.hour1=b.hour1上的
左外部联接表b是否需要,其中a.hour1不是空的
部分?我在每个小时都执行了相同的代码,没有这个部分,它产生了相同的结果。因此,我猜
MightMouse
列名根据
replace(MightMouse,'hour','')hour
语句被重命名为
hour
,对吗?嗯,
MightMouse
的列名是“MightMouse”。替换的是mighmouse列的内容,它是由源列名(
hour1,hour2,…
)构成的。