日期:2014-05-18  浏览次数:20486 次

怎么优先查出某些记录?
现在有这样一个表(共三列C1,C2,C3):
C1             C2             C3
01             C01           A01
02             C01           空串
03             C01           NULL

现在要求做到:
如果C2例的值为C01,C3列非空且不是空串,则找出这条记录,否则找出C3列值是空串或NULL的任一条记录,对于上述例子,如果给的条件是:
要求   C2= 'C01 '   和   C3= 'A01 ',如果存在这样的行,则直接找出这行,如果找不到,则找到C2= 'C01 '且C3= ' '或C3为NULL的行即可。
请问这样的查询语句如何实现?



------解决方案--------------------
declare @test1 table (C1 varchar(10), C2 varchar(10), C3 varchar(10))
insert @test1
select '01 ', 'C01 ', 'A01 '
union all select '02 ', 'C01 ', ' '
union all select '03 ', 'C01 ', NULL
select top 1 * from (
select * from @test1 where C2= 'C01 ' and C3= 'A01 ' union all
select * from @test1 where C2= 'C01 ' and isnull(C3, ' ') = ' ') a


declare @test2 table (C1 varchar(10), C2 varchar(10), C3 varchar(10))
insert @test2
select '01 ', 'C01 ', 'B01 '
union all select '02 ', 'C01 ', ' '
union all select '03 ', 'C01 ', NULL
select top 1 * from (
select * from @test2 where C2= 'C01 ' and C3= 'A01 ' union all
select * from @test2 where C2= 'C01 ' and isnull(C3, ' ') = ' ') a

------解决方案--------------------
如果都是只查一条的话
select top 1 * from table
where
C2= 'C01 ' and isnull(C3, ' ') in ( ' ', 'A01 ')
order by case isnull(C3, ' ') when 'A01 ' then 1 else 2 end


------解决方案--------------------
本来昨天这个时候就写好了回答的.
结果刚想回答,网断了....

--创建测试数据
create table tb1(c1 varchar(5),c2 varchar(5),c3 varchar(5))
insert tb1 select '01 ', 'C01 ', 'A01 '
union all select '02 ', 'C01 ', ' '
union all select '03 ', 'C01 ',null
union all select '04 ', 'C02 ', 'A02 '
union all select '05 ', 'C02 ', ' '
union all select '06 ', 'C02 ',null

/*方法1
如果楼主可以把数据库中的null值全部统一更新为 ' '
则问题简化,
可以用下条语句实现
*/
select * from tb1
where c2= 'C01 ' and (
c3 =(case when exists(select * from tb1 where c2= 'C01 ' and c3= 'A01 ')
then 'A01 '
else ' ' end))
/*结果
01 C01 A01
*/

/*方法1.1
不改变数据库原有记录,只在显示的时候转化
注:所null和 ' '统一显示成 ' '
*/
select * from
(select c1= c1,c2=c2,c3=isnull(c3, ' ') from tb1 ) z
where c2= 'C01 ' and (
c3 =(case when exists(select * from tb1 where c2= 'C01 ' and c3= 'A02 ')
then 'A02 '
else ' ' end))
/*结果
02 C01
03 C01
*/

/*方法2
如果想把null和 ' '都显示出来
我给你写了个存储过程
注:这个存储过程是与表相关的,使用时请修正
*/
create procedure proc_slt(
@con1 varchar(100),
@con2 varchar(100))
as
begin
declare @sql varchar(8000)
declare @condition varchar(4000)

set nocoun