sql server 按值得优先级做帅选数据的条件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 按值得优先级做帅选数据的条件?相关的知识,希望对你有一定的参考价值。

例如有两个字段,需要更具type的优先级来定where语句。
ID TYPE
1 A
1 B
1 C
-----
2 B
2 C
----
3 B
3 C

要求:有A的先选A的那条,否则B的那条,否则C的那条。
结果就应该是
ID TYPE
1 A
-----
2 B
----
3 B

在IBM netezza里可以写作
where
case

when type='A' then type='A'

when type='B' then type='B'
when type='C' then type='C'
else ''

end

但是在sql server 2008里好像不可以这么写,那有什么较好的方法来实现这个功能,要兼顾效率。此表数据为千万级别。

Thanks

楼主 case when返回的是结果集 怎么能放在where条件后面呢
放在查询字段里面就可以了
select *,case

when type='A' then type='A'

when type='B' then type='B'
when type='C' then type='C'
else ''

end from 表名

如果你只想看abc返回的 结果就再嵌套一个查询即可
select * from (
select *,case

when type='A' then type='A'

when type='B' then type='B'
when type='C' then type='C'
else ''

end typen from 表名) a
where a. typen in(a,b,c)
参考技术A

你的意思就是用type里的值按优先级排列好后,在where里当条件用吗?

select * from 表名 where 列名 = (select type from 表名 order by type asc)

用order by 先把type按升序排列好后,再取type值作where的筛选条件。然后再显示目标表的数据。不知道这样可不可以满足到你的要求?

追问

其实我的type字段有两个值DIRECT , GEO。对于同一个ID,如果有DRIECT的就选出DIRECT的记录,没有的话就选出GEO。我直接选出DIRECT的记录union all 上所有GEO的记录并且ID不在刚刚选出来的DIRECT里的也能实现了。谢谢。

参考技术B SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。
另外:一个查询语句各个部分的执行顺序:
--8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
--(1) FROM <left_table>
--(3) <join_type> JOIN <right_table>
--(2) ON <join_condition>
--(4) WHERE <where_condition>
--(5) GROUP BY <group_by_list>
--(6) WITH CUBE | ROLLUP
--(7) HAVING <having_condition>
--(10) ORDER BY <order_by_list>

sql server 按时间段查询

百度的资料,保存下来:

在写按时间段查询的sql语句的时候 一般我们会这么写查询条件:

  where date>=‘2010-01-01‘ and date<=‘2010-10-1‘。

但是在实执行Sql时些语句会转换成这样:

  where date>=‘2010-01-01 0:00:00‘ and date<=‘2010-10-1:0:00:00‘,再看这个条件的话,也许就会有些明白,

那就是‘2010-10-1 0:00:00‘ 之后的数据例如(‘2010-10-1:08:25:00‘)查不到,也就是说2010-10-1的数据查不到。

知道原因了可以修改查询条件为:

   where date>=‘2010-01-01‘ and date<=‘2010-10-1 23:59:59‘ 或 where date>=‘2010-01-01‘ and date<=‘2010-10-2‘。

某个表某个字段是Datetime型 以"YYYY-MM-DD 00:00:00" 存放

 

(1)、例如数据

2009-01-22 21:22:22
2009-01-22 19:21:11
2009-01-22 23:10:22


(2)、用 select * from TABLE where date between ‘2009-1-22‘ And ‘2009-1-22‘ ,想查日期为2009-1-22的记录,结果查不到

 

(3)、问题原因

短日期类型默认Time为00:00:00,所以当使用between作限制条件时,就相当于between ‘2009-1-22 00:00:00‘ and ‘2009-1-22 00:00:00‘,因此就查不出数据。

 

(4)、解决方法



  --方案一:对数据库里面的字段进行日期格式转换

  select * from tb where convert(varchar(10),riqi,120) = ‘2009-01-22‘


  --方案二:给日期补全时分秒

  select * from tb where riqi between ‘2009-01-22 00:00:00‘ and ‘2009-01-22 23:59:59‘


  --结果
  /**//*
  id riqi
  ---- ------------------------------------------------------
  A 2009-01-22 21:22:22.000
  B 2009-01-22 19:21:11.000
  C 2009-01-22 23:10:22.000
  
  (所影响的行数为 3 行)
  */













































以上是关于sql server 按值得优先级做帅选数据的条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中的 OR 条件中确定优先级

SQL Server - 如何确定select查询中条件的优先级

SQL SERVER中的And与Or的优先级

SQL server如何查询满足条件的前3数据

为啥sqlserver查询不到数据

如何提高SQL Server大数据条件下的查询速度?