最近做项目中用到了几个不常用的sql,现总结如下:
1.CHARINDEX ( expression1 , expression2 [ , start_location ] )(注:该方法只用于SqlServer)
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置,如果没有找到字符串,则返回0.
Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。
实际运用中,可以用来实现按照指定字符串顺序排序显示:
select name from tab order by CHARINDEX(name,'张三,李四,王五') asc;
显示结果:name
张三
李四
王五
2.case when then
sql语句判断方法之一
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
例子:
有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
显示格式:
语文 数学 英语
及格 优秀 不及格
------------------------------------------
select
(case when 语文>=80 then '优秀'
when 语文>=60 then '及格'
else '不及格') as 语文,
(case when 数学>=80 then '优秀'
when 数学>=60 then '及格'
else '不及格') as 数学,
(case when 英语>=80 then '优秀'
when 英语>=60 then '及格'
else '不及格') as 英语,
from table
CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例 如,你可以在 WHERE 子句中使用 CASE。
首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下:
SELECT =
CASE
WHEN THEN
WHEN THEN
ELSE
END
在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:
USE pubs
GO
SELECT
Title,
'Price Range' =
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
FROM titles
ORDER BY price
GO
这是 CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。将指定记录默认排到最前面:
3.for xml path('')
那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:
接下来我们来看应用FOR XML PATH的查询结果语句如下:
结果:
< hobbyID > 1 </ hobbyID >
< hName > 爬山 </ hName >
</ row >
< row >
< hobbyID > 2 </ hobbyID >
< hName > 游泳 </ hName >
</ row >
< row >
< hobbyID > 3 </ hobbyID >
< hName > 美食 </ hName >
</ row >
由此可见FOR XML PATH 可以将查询结果根据行输出成XML各式!
那么,如何改变XML行节点的名称呢?代码如下:
结果一定也可想而知了吧?没错原来的行节点<row> 变成了我们在PATH后面括号()中,自定义的名称<MyHobby>,结果如下:
< hobbyID > 1 </ hobbyID >
< hName > 爬山 </ hName >
</ MyHobby >
< MyHobby >
< hobbyID > 2 </ hobbyID >
< hName > 游泳 </ hName >
</ MyHobby >
< MyHobby >
< hobbyID > 3 </ hobbyID >
< hName > 美食 </ hName >
</ MyHobby >
这个时候细心的朋友一定又会问那么列节点如何改变呢?还记的给列起别名的关键字AS吗?对了就是用它!代码如下:
那么这个时候我们列的节点名称也会编程我们自定义的名称 <MyCode>与<MyName>结果如下:
< MyCode > 1 </ MyCode >
< MyName > 爬山 </ MyName >
</ MyHobby >
< MyHobby >
< MyCode > 2 </ MyCode >
< MyName > 游泳 </ MyName >
</ MyHobby >
< MyHobby >
< MyCode > 3 </ MyCode >
< MyName > 美食 </ MyName >
</ MyHobby >
没错我们还可以通过符号+号,来对字符串类型字段的输出格式进行定义。结果如下:
SELECT stuff(','+hName,1,1,'') FROM @hobby FOR XML PATH('')
结果如下:
SELECT cast(stuff(','+hName,1,1,'') as nvarchar) FROM @hobby FOR XML PATH('')