项目中一些sql的运用

最近做项目中用到了几个不常用的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 ' )

 

      结果一定也可想而知了吧?没错原来的行节点<row> 变成了我们在PATH后面括号()中,自定义的名称<MyHobby>,结果如下:

复制代码
< 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 ' )

 

      那么这个时候我们列的节点名称也会编程我们自定义的名称 <MyCode>与<MyName>结果如下:
复制代码
< 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('')


猜你喜欢

转载自blog.csdn.net/ding_dq/article/details/79191610