最近做项目中用到了几个不常用的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 其实可以做更多的事情。将指定记录默认排到最前面:
select name from tab order by case when name='张三' then 0 else 1 end,name asc;
该条语句的意思就是将名字是张三的记录排到最前面。
3.for xml path('')
那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:
接下来我们来看应用FOR XML PATH的查询结果语句如下:
SELECT
*
FROM
@hobby
FOR
XML PATH
结果:
<
row
>
<
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行节点的名称呢?代码如下:
SELECT
*
FROM
@hobby
FOR
XML PATH(
'
MyHobby
'
)
结果一定也可想而知了吧?没错原来的行节点 变成了我们在PATH后面括号()中,自定义的名称,结果如下:
<
MyHobby
>
<
hobbyID
>
1
hobbyID
>
<
hName
>
爬山
hName
>
MyHobby
>
<
MyHobby
>
<
hobbyID
>
2
hobbyID
>
<
hName
>
游泳
hName
>
MyHobby
>
<
MyHobby
>
<
hobbyID
>
3
hobbyID
>
<
hName
>
美食
hName
>
MyHobby
>
这个时候细心的朋友一定又会问那么列节点如何改变呢?还记的给列起别名的关键字AS吗?对了就是用它!代码如下:
SELECT
hobbyID
as
'
MyCode
'
,hName
as
'
MyName
'
FROM
@hobby
FOR
XML PATH(
'
MyHobby
'
)
那么这个时候我们列的节点名称也会编程我们自定义的名称 与结果如下:
<
MyHobby
>
<
MyCode
>
1
MyCode
>
<
MyName
>
爬山
MyName
>
MyHobby
>
<
MyHobby
>
<
MyCode
>
2
MyCode
>
<
MyName
>
游泳
MyName
>
MyHobby
>
<
MyHobby
>
<
MyCode
>
3
MyCode
>
<
MyName
>
美食
MyName
>
MyHobby
>
噢! 既然行的节点与列的节点我们都可以自定义,我们是否可以构建我们喜欢的输出方式呢?还是看代码:
SELECT
'
[
'
+
hName
+
'
]
'
FROM
@hobby
FOR
XML PATH(
''
)
没错我们还可以通过符号+号,来对字符串类型字段的输出格式进行定义。结果如下:
一般我们都喜欢以,隔开,代码如下
SELECT stuff(','+hName,1,1,'') FROM @hobby FOR XML PATH('')
结果如下:
在将sql应用到Java代码进行展示时,得出的结果不是字符串,而是一个对象,所以要用cast(xx as nvarchar)将其转为字符串,如下:
SELECT cast(stuff(','+hName,1,1,'') as nvarchar) FROM @hobby FOR XML PATH('')