SQL找到第一个结果后停止查询

时间:2017-06-09 15:21:16

标签: sql sql-server

程序可以使用邮政编码或帐号接受两个输入搜索。尝试使用任何一个SQL,我正在使用sql server。

select name, city, zip, acc_number
 case when zip then zip ='01111'
 when acc_number then acc_number = '00007'
 else NULL end as nodata
from mytable

我可能误解了案例逻辑,我想说,如果zip有价值使用zip的值并执行搜索并忽略acc_number并且当zip不是true时使用acc_number中的值,否则返回NULL

感谢您的期待!

5 个答案:

答案 0 :(得分:1)

也许那个?它首先按zip进行搜索。然后,如果没有记录发现union all的第二部分按acc_number搜索。

;with _raw as (
    select
        name, city, zip, acc_number
    from mytable
    where zip ='01111'

    union all

    select
        name, city, zip, acc_number
    from mytable
    where acc_number = '00007'


)
select top 1
    *
from _raw

答案 1 :(得分:1)

由于您提到您已经过滤掉参数以检查您的查询是zip还是acc_number

declare @Zip int = 07652;
declare @acc_number int;

select top 1
name, city, zip, acc_number from mytable
    where 
        1 = case when isnull(@zip,0)!=0 and zip = @Zip then 1 else 0 end
    or 
        1 = case when isnull(@zip,0)=0 and acc_number = @acc_number then 1 else 0 end

答案 2 :(得分:0)

这个怎么样:

select name, city, zip, acc_number
from mytable
where zip ='01111'
or acc_number = '00007'

我不确定我是否正确理解了您的问题,但这将根据邮编' 01111'进行搜索。 (并忽略acc_number),或根据acc_number' 00007'进行搜索,并忽略该zip。

如果我误解了,请告诉我。

答案 3 :(得分:0)

这样的东西?你的问题不是100%明确

select name, city, zip, acc_number
 case when zip ='01111' then 'Match'
else when acc_number acc_number = '00007' then 'Match'
 else 'Not match' end as nodata
from mytable

答案 4 :(得分:0)

你只需要一个条件where子句。这允许您做的是为两个参数或两个参数传递值。如果两个参数都在结果中传递,则返回的结果基于两个条件。也就是说,如果帐号是您在 AND 中传递的,则会传入邮政编码。如果您只传入一个参数,则只使用该参数来限制结果。如果您同时保留NULL,则会返回所有记录。

declare @zip varchar(16), @acc_number varchar(16)
set @zip = null
set @acc_number = '00007'
if @zip is not null set @acc_number = null

select 
  name, 
  city, 
  zip, 
  acc_number
from 
  mytable
where  
  (zip = @zip or @zip is null)
  and
  (acc_number = @acc_number or @acc_number is null)