SQL 常用语句 Case When select into from 和 insert into select 插入临时表
Case when 的用法: 一旦满足了某一个WHEN, 则这一条数据就会退出CASE WHEN , 而不再考虑 其他CASE;
Case when 的用法
-- 搜索Case函数:
Case函数(Case搜索函数): 判断表达式的真假,如果为真,返回结果;如果为假,返回else值;如果未定义else值,则返回空值(使用条件确定返回值);
select name,id,(case when id=34 then salary*2
when id=45 then salary*3
else salary
end) new_salary
from semp;
-- 简单Case函数
简单Case表达式的作用是: 使用表达式确定返回值:
select id,name,(case sex
when '1' then '男'
when '2' then '女'
else '其他' end)
from student;
这两种方法可以实现相同的功能. 简单Case函数的写法比较简单,但是和case搜索函数相比,功能方面会有些限制,比如判断式.
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略.
比如下面 SQL,将无法得到第二个结果:(差永远获取不到)
sql如下
case when colum in ('a', 'b') then '优秀'
when colum in ('a') then '差'
else '其他' end
Case when LIKE 的用法
CASE
WHEN TargetName LIKE '%均值%' THEN
TargetAvg
WHEN TargetName LIKE '%累计%' THEN
TargetValue
WHEN TargetName LIKE '%标偏%' THEN
TargetRet
ELSE
TargetValue
END AS Value,
使用 case when进行行列转换
固定列数的行列转换
如表结构为:
如
Name subject score
---------------------------
张三 语文 80
张三 数学 70
张三 英语 60
李四 语文 90
李四 数学 80
李四 英语 100
....
转换为 :
语文 数学 英语
张三 80 70 60
李四 90 80 100
要求:创建表,源表,表名: Stu , 只用一句sql 得到转换结果。
解答:
方法一 :通过生成临时表的方式操作
select name ,sum(yw) as '语文',sum(sx) as '数学',sum(wy) as '英语'
from(
select name ,
CASE subject WHEN '语文' THEN score END AS yw,
CASE subject WHEN '数学' THEN score END AS sx,
CASE subject WHEN '英语' THEN score END AS wy
from Stu
) tempStu
group by name
方法二:课程只有语文、数学、物理这三门课程则可以使用静态sql 来实现 Sql2000
select name as 姓名,
max(case subject when '语文' then score else 0 end) 语文,
max(case subject when '数学' then score else 0 end) 数学,
max(case subject when '英语' then score else 0 end) 英语
from Stu
group by name
方法三:如果课程不止语文、数学、物理这三门课程 则可以使用动态sql 来实现
创建一个用户变量,使用简单的T-SQL来实现。 Sql2000
declare @sql varchar(8000) --声明一个变量
set @sql = 'select name as 姓名'
select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score else 0 end) [' + subject+ ']'
from (select distinct subject from Stu) as a
set @sql = @sql + ' from Stu group by name'
print @sql --打印生成的sql
exec(@sql) --执行该sql
注: case when的作用就是一个条件选择语句,根据不同的要求显示不同的内容,格式是这样的case
when [选择条件]
then [结果1]
else [结果2]
end
其中[选择条件]也可以放在case之后。
CASE WHEN语句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型数据库都受到支持,是标准的SQL语句.
自己用到的sql
if OBJECT_ID('tempdb..#temp') is not null drop table #temp select * into #temp from ( SELECT MESOrderID, TargetName, CASE WHEN TargetName LIKE '%均值%' THEN TargetAvg WHEN TargetName LIKE '%累计%' THEN TargetValue WHEN TargetName LIKE '%标偏%' THEN TargetRet ELSE TargetValue END AS value, TargetUnit, CheckResult FROM dbo.EProductProgressTarget WHERE MESOrderID IN ( SELECT MESOrderID FROM dbo.EWorkOrder WHERE ClassShiftID IS NOT NULL AND SourceCode = 'ApplyMES' AND WorkstageCode = 'MTA5' AND CreateTime > '2021-12-01 00:38:57.2559147' ) AND ( TargetCode IN ( '6072.6072.MTA5_SJ2344_AFeedAccTotal', '6072.6072.MTA5_SJ2344_AddFeedTotal', '6072.6072.MTA5_SJ2344_InFlowTotal' ) OR ParmCode IN ( 'MTA5229', 'MTA5227', 'MTA5230', 'MTA5231', 'MTA5228' ) ) AND ProgressType = 'End' ) as A SELECT * FROM #temp declare @sql varchar(4000) set @sql = 'select mesorderid' select @sql = @sql + ',max(case targetname when '''+targetname+''' then value end) ['+targetname+']' from (select distinct targetname from #temp ) as a order by targetname select @sql = @sql+' from #temp group by mesorderid' --print @sql exec(@sql)
sql插入临时表数据的方法
方法有两种,主要看需求。
方法1:定义好临时表的字段和类型、插入对应的值
create table #Tmp --创建临时表#Tmp ( City varchar(50), -- Country varchar(50), -- ); insert #Tmp select '北京','中国' union select '东京','日本' union select '纽约','美国' select * from #Tmp;
方法2:直接将查询出来的表数据插入临时表中
if OBJECT_ID('tempdb..#temp') is not null drop table #temp select * into #temp from ( --select * from Activity select 7 as 'month',25 as 'day' union all select 7 as 'month',25 as 'day' union all select 8 as 'month',25 as 'day' union all select 8 as 'month',25 as 'day' union all select 8 as 'month',25 as 'day' ) as A select * from #temp
select into from 和 insert into select 的用法和区别
select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在
下面分别介绍两者语法
一、INSERT INTO SELECT语句
1、语句形式为:
Insert into Table2(field1,field2,...) select value1,value2,... from Table1
2、注意地方:
(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
(4)由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。
3、完整实例:
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
select * from Table2
--3.INSERT INTO SELECT语句复制表数据
Insert into Table2(a, c, d) select a,c,5 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
二、SELECT INTO FROM语句
语句形式为:
SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中 。
完整实例:
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
本文来自博客园,作者:王晓升,转载请注明原文链接:https://www.cnblogs.com/xiaosheng1989/p/16457397.html