在sql的where条件下怎么加sql where判断语句句

中国领先的IT技术网站
51CTO旗下网站
使用SQL中SELECT语句的使用条件逻辑
如果使用CASE表达式直接在SELECT语句中执行条件逻辑,可以解决使用数据库中的一些问题,下面将为您示例分析,供您参考
作者:格子来源:互联网| 14:56
如果使用CASE表达式直接在中执行条件逻辑,可以解决使用数据库中的一些问题,下面将为您示例分析,供您参考:
&&& 在SELECT语句中对数值进行IF-ELSE操作。例如,要产生一个结果集,如果一个员工的工资小于等于$2000,就返回消息UNDERPAID,如果大于等于$4000,就返回消息OVERPAID,如果在两者之间,就返回OK。结果集应如下所示:
----------
----------
----------
&&& 使用CASE表达式直接在SELECT语句中执行条件逻辑。
select ename,sal,
case when sal &= 2000 then 'UNDERPAID'
when sal &= 4000 then 'OVERPAID'
end as status
&&& CASE表达式可以针对返回值执行条件逻辑。可以给CASE表达式取别名,以返回更易读的结果集。在本解决方案中,给CASE表达式取的别名是STATUS。ELSE子句是可选的,如果没有使用ELSE,对于不满足判断条件的行,CASE表达式会返回NULL。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条热点头条头条热点
24H热文一周话题本月最赞
讲师:132069人学习过
讲师:785143人学习过
讲师:131581人学习过
精选博文论坛热帖下载排行
JBuilder 2006是一款强大的Java企业级开发平台,其集成了几乎所有的Java技术,涵盖了软件开发生命周期的各个过程。本书深入浅出地介绍了JBu...
订阅51CTO邮刊当我们使用某个表达式作为输出的一列时
我们无法再
条件中直接使用该列作判断条件
例如下面的
select id, (c1 + c2) as s from t1
where s & 100
SQL Server
select id, (c1 + c2) as s from t1
where (c1 + c2) & 100
就没问题了
可是当表达式复杂时就很繁琐了
有没有可以在
中使用这样的列名的办法
或者有什么其他办法可以解决这类问题呢
解决方法:
select t2.*
from (select id, (c1 + c2) as c from t1) t2
where c & 100
select t2.*
from (select id, c = c1+c2 from t1) t2
where c & 100
语句不能直接使用列别名,因此我们需要将
语句给包装一下
子句中引用列别名会出错,这是为什么呢?
语句的执行顺序
3. start with
4. connect by
6. group by
等集合演算演算
11. order by
本文已收录于以下专栏:
相关文章推荐
select * from (SELECT sheng.prov_name,shi.city_ty_name,us.`school_name`,
(SELECT C...
转自:/dwfbenben/archive//3307941.html
当我们使用某个表达式作为输出的一列时,我们无法再Where条...
转载自:/Tech/Database/MSSQL/91.html
当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件....
/Tech/Database/MSSQL/91.html------------------同意
/hellofra...
有表eetymology:
然后,有这样一个查询语句:
SELECT word, e.* FROM eetymology e
不知道看到这个语句的你有何感想,反正今天我看到一个类似的语句时是懵懵...
select列的时候取别名有三种方法,这三种方法并不是所有数据库都适用。
方法一、直接在字段名称后面加上别名,中间以空格隔开。
方法二、以as关键字指定字段别名,as在select的字段和...
在执行P处理时需要根据传经来的参数来写where条件的时候可能因为,参数太多,或者传值的范围太多而导致sql的where条件不好写。嵌套什么的都out。
最好的方法是,定义一个变量如: v_strS...
–查询当天:
select * from info where DateDiff(dd,datetime,getdate())=0
–查询24小时内的:
select * from ...
转自:http://blog.csdn.net/sforiz/article/details/5345359
和      /exe19/p/578680...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2013年 总版技术专家分年内排行榜第二
2014年8月 总版技术专家分月排行榜第一2014年7月 总版技术专家分月排行榜第一2014年6月 总版技术专家分月排行榜第一2014年5月 总版技术专家分月排行榜第一2014年4月 总版技术专家分月排行榜第一2014年3月 总版技术专家分月排行榜第一2014年1月 总版技术专家分月排行榜第一2013年12月 总版技术专家分月排行榜第一
2014年1月 总版技术专家分月排行榜第二2013年12月 总版技术专家分月排行榜第二
2016年10月优秀小版主
2014年1月 总版技术专家分月排行榜第二2013年12月 总版技术专家分月排行榜第二
2016年10月优秀小版主
本帖子已过去太久远了,不再提供回复功能。Access俱乐部
?&&&&?&&&&?&&&&?&&&&
您的位置:  > >
SQL利用Case When Then多条件判断
来源:&&点击数:14685&&评论数:0 &|&&|&
时 间: 10:18:09
作 者:&&&ID:16058&&城市:江阴
摘 要:CASE&&&&WHEN&条件1&THEN&结果1&&&&WHEN&条件2&THEN&结果2&&&&WHEN&条件3&THEN&结果3&&&&WHEN&条件4&THEN&结果4.........&&&&WHEN&条件N&THEN&结果N&&&&ELSE&结果XEND
sql语句判断方法之一
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
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分表示不及格。
显示格式:
语文 数学 英语
及格 优秀 不及格
------------------------------------------
(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 &myColumnSpec& =
&&&&&&&&&&& CASE
&&&&&&&&&&& WHEN &A& THEN &somethingA&
&&&&&&&&&&& WHEN &B& THEN &somethingB&
&&&&&&&&&&& ELSE &somethingE&
&&&&&&&&&&& END
在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:
&&&&&&&&&&& 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 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE:
Select 'Number of Titles', Count(*)
&&&&&&&&&&& FROM titles
&&&&&&&&&&& GROUP BY
&&&&&&&&&&& 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
&&&&&&&&&&& GO
你甚至还可以组合这些选项,添加一个 orDER BY 子句,如下所示:
&&&&&&&&&&& GO
&&&&&&&&&&& Select
&&&&&&&&&&& 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 AS Range,
&&&&&&&&&&& Title
&&&&&&&&&&& FROM titles
&&&&&&&&&&& GROUP BY
&&&&&&&&&&& 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,
&&&&&&&&&&& Title
&&&&&&&&&&& orDER BY
&&&&&&&&&&& 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,
&&&&&&&&&&& Title
&&&&&&&&&&& GO
注意,为了在 GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 Select 块中的 CASE 块。
除了选择自定义字段之外,在很多情况下 CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。
      
&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】
Access网店
价格:¥400 元
价格:¥50 元
价格:¥100 元
(10-21 22:57)
(10-21 16:30)
(10-21 12:42)
(10-21 10:43)
(10-21 04:56)
(10-21 00:00)
(10-20 22:55)
(10-20 18:55)
(10-20 15:48)
(10-20 13:26)
Access软件网 版权所有 CopyRight
提供支持 本站特聘法律顾问: 李慧 律师SQL查询条件放ON子句与放WHERE子句区别以及SQL连接原理
同事问我将查询条件放在ON 子句中和放在WHERE子句中的查询结果是否相同,我感觉应该不一样,但又 不能确定,于是决定测试一下。
因为左链接和右连接在本质上是相同的,而外链接基本上不会用到,所以我只 对左链接和内链接进行了测试。
我首先创建2个用来测试的表,如下:
id&&&&&&&&&&size&&&&&&&&
----------- -----------
1&&&&&&&&&&&10
2&&&&&&&&&&&20
3&&&&&&&&&&&30
id&&&&&&&&&&size&&&&&&&&name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
----------- ----------- ---------
1&&&&&&&&&&&10&&&&&&&&&&AAA
2&&&&&&&&&&&20&&&&&&&&&&BBB
3&&&&&&&&&&&20&&&&&&&&&&CCC
以下是我建表及插入数据所用的脚本:
create table tab1(id int, size int)
create table tab2(size int, name varchar(128))
insert into tab1(id,size)values(1,10)
insert into tab1(id,size)values(2,20)
insert into tab1(id,size)values(3,30)
insert into
tab2(id,size, name)values(1,10,'AAA')
insert into tab2(id,size, name)values(2,20,'BBB')
insert into tab2(id,size, name)values(3,20,'BBB')
准备好了以后,我先运行了以下脚本:
* from tab1, tab2 order
by tab1.size
id&&&&&&&&&&size&&&&&&&&id&&&&&&&&&&size&&&&&&&&name&&&&&&&
----------- ----------- -----------
----------- ----------
1&&&&&&&&&&&10&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
1&&&&&&&&&&&10&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
1&&&&&&&&&&&10&&&&&&&&&&3&&&&&&&&&&&20&&&&&&&&&&CCC
2&&&&&&&&&&&20&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
2&&&&&&&&&&&20&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
2&&&&&&&&&&&20&&&&&&&&&&3&&&&&&&&&&&20&&&&&&&&&&CCC
3&&&&&&&&&&&30&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
3&&&&&&&&&&&30&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
3&&&&&&&&&&&30&&&&&&&&&&3&&&&&&&&&&&20&&&&&&&&&&CCC
(所影响的行数为 9 行)
为了测试对于左连接的影响情况,我运行了下面的语句:
* from tab1 left join tab2 on tab1.size = tab2.size and tab1.id =
* from tab1 left join tab2 on tab1.size = tab2.size where tab1.id =
id&&&&&&&&&&size&&&&&&&&id&&&&&&&&&
size&&&&&&&&name&&&&&&&
----------- ----------- -----------
----------- ----------
1&&&&&&&&&&&10&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
2&&&&&&&&&&&20&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
3&&&&&&&&&&&30&&&&&&&&&&NULL&&&&&&&&NULL&&&&&&&&NULL
(所影响的行数为 3 行)
id&&&&&&&&&&size&&&&&&&&id&&&&&&&&&&size&&&&&&&&name&&&&&&&
----------- ----------- -----------
----------- ----------
1&&&&&&&&&&&10&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
2&&&&&&&&&&&20&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
(所影响的行数为 2 行)
我发现将条件放在on子句中时,查询结果中多 出一行,多出这一行的tab2.id的值为空。上面结果中用红色标出的行即是多出的行。
我又执行了以下查询:
* from tab1 left join tab2 on tab1.size = tab2.size;
* from tab1 left join tab2 on 1=1 where tab1.size = tab2.size;&&&if (p_direction = 1) then
id&&&&&&&&&&size
&&&&&&&id&&&&&&&&&&size&&&&&&&&name&&&&&&&
----------- ----------- -----------
----------- ----------
1&&&&&&&&&&&10&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
2&&&&&&&&&&&20&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
2&&&&&&&&&&&20&&&&&&&&&&3&&&&&&&&&&&20&&&&&&&&&&CCC
3&&&&&&&&&&&30&&&&&&&&&&NULL&&&&&&&&NULL&&&&&&&&NULL
(所影响的行数为 4 行)
id&&&&&&&&&&size&&&&&&&&id&&&&&&&&&&size&&&&&&&&name&&&&&&&
----------- ----------- -----------
----------- ----------
1&&&&&&&&&&&10&&&&&&&&&&1&&&&&&&&&&&10&&&&&&&&&&AAA
2&&&&&&&&&&&20&&&&&&&&&&2&&&&&&&&&&&20&&&&&&&&&&BBB
2&&&&&&&&&&&20&&&&&&&&&&3&&&&&&&&&&&20&&&&&&&&&&CCC
(所影响的行数为 3 行)
我发现将条件放在ON子句中的查询的结果仍多 出一行。并且,我发现每次多出的行都是不符合链接条件的,即tab1.size 不等于
tab2.size, 但是它符合左链接要求,那就是“左链接将得到左边表的所有行”。
现在,对于左链接的情况我似乎找到了规律。我想下面的查询的结果肯定相 同:
* from tab1 left join tab2 on tab1.id = tab2.
* from tab1 left join tab2 on 1=1 where tab1.id
限于篇幅,我在这里不列出结果,你可以自己试试看。
研究了左链接,接下来是应该研究一下内连接了,可是我发现本文的字数已接 近4000(这是百度博客的字数限制,好无奈),这意味着我不能再写了,呵呵。既然如此,那就把我的研究结果写在这里好了。
其实从对左链接的研究结果来看,我们应该已经能够想到内链接的情况了,那 就是查询结果放在ON子句或WHERE子句对查询结果没有影响!因为左链接只会得到符合链接条件的 记录。我运行了下面的查询:
* from tab1 inner join tab2 on tab1.size = tab2.size and tab2.name='AAA'
* from tab1 inner join tab2 on tab1.size = tab2.size where tab2.name='AAA'
运行结果在预料之中,都只有一条记录。
内联外联左联右联的原理及联后效果
使用关系代数合并数据关系代数合并数据集合的理论基础是关系代数,它是由于年提出的。在关系代数的形式化语言中:r用表、或者数据集合表示关系或者实体。r用行表示元组。r用列表示属性。关系代数包含以下个关系运算符r选取返回满足指定条件的行。r投影从数据集合中返回指定的列。r笛卡尔积是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。r并关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。r交返回两个数据集合所共有的行。r差返回只属于一个数据集合的行。r连接在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。r除返回两个数据集之间的精确匹配。此外,作为一种实现现代关系代数运算的方法,还提供了:r子查询类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。使用连接连接类型在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。连接类型定义内连接只连接匹配的行左外连接包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行全外连接包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。连接使用等值以外的条件来匹配左、右两个表中的行交叉连接生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配在中连接表的查询如果子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。语句的子句可以指定以下几种类型的连接子句关键字相应的结果集笛卡尔乘积(所有可能的行对)仅对满足连接条件的中的列一个表满足条件的行,和另一个表的所有行与相同,但两个表的角色互换和中所有行的超集内连接()内连接是最常见的一种连接,它页被称为普通连接,而最早称之为自然连接。下面是-标准其中可以省略。等价于早期的连接语法外连接左外连接其中可以省略。右外连接全外连接全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。外连接与条件配合使用当在内连接查询中加入条件是,无论是将它加入到子句,还是加入到子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到子句时,、会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到子句中,将会首先进行连接操作,然后使用子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:条件在子句结果是:天河区天河区越秀区白云区条件在子句结果是:天河区天河区自身连接自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。下面例子是在机构表中查找本机构和上级机构的信息。结果是:广州市天河区广州市越秀区广州市白云区交叉无限制连接交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有个行,而第二个数据源中有个行,那么在它们之间进行交叉连接就会产生个行。人们将这种类型的结果集称为笛卡尔乘积。大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。在交叉连接中没有条件子句
TA的最新馆藏[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 sql条件判断语句赋值 的文章

 

随机推荐