SQL where exists case 语句
SQL Where exists case statement
我不确定如何将 if/case
与 where exists
语句结合起来。以下所有字段都位于 t_phone
这是设置 - 声明了一个 phone 临时变量
Declare @phone varchar(25)
`select @phone = ....`
我们需要说的是对于给定的 customer_no
如果 phone_type
(来自 t_phone
)对于 customer_no 存在,则类型为 25 使用 phone_no 关联类型 = 25,否则使用类型 2。
例如
phone_no type customer_no
1234567890 2 4
0987654321 25 4
6537327345 2 8
基于上面的例子,对于客户 4 我们想设置 @phone = 0987654321,因为存在类型 25,但是对于客户 8 我们想使用类型 2,因为没有替代的 25类型。
如果只有 2 和 25 类型,您可以像下面这样 SELECT MAX()
:
Select t.phone_no
from t_phone t
where t.type = (select max(ti.type)
from t_phone ti
where ti.customer_no=t.customer_no
and ti.type in (2,25))
由于您只与一个客户打交道,而您想要的唯一值是类型 2 和 25,像这样简单的事情怎么样。
select top 1 phone_no
from t_phone
where customer_no = @Customer
order by
case type when 25 then 2
when 2 then 1
else 0 end
declare @phone varchar(25)
select @phone = CASE t0.[type]
WHEN 25 THEN t1.phone_no
WHEN 2 then t2.phone_no
else 0
END
from tbl t0
left outer join tbl t1 on t1.type = 25 and t1.customer_no = t0.customer_no
left outer join tbl t2 on t2.type = 2 and t2.customer_no = t0.customer_no
您可以通过引入一个名为 type_priority
的 table 来使其更易于实施 和 维护。这将有两列:type
和 priority
。对于 type=25
,priority
将是最高的 10,对于 type=2
,priority
将是 1。
然后,当您 select 加入此 table 时,按 priority DESC
订购并选择 top 1
。
select top 1 @phone = phone_no
from t_phone ph
join type_priority tp on tp.type = ph.type
where customer_no = @Customer
order by tp.priority desc
这种数据驱动的方法更易于维护,因为如果您引入其他类型,只需使用适当的 priority
将行添加到 type_priority
table 并且 sql 语句继续一样工作。
请注意,对于 type_priority
table 中缺失的 types
,记录将不会被 select 编辑。因此,您需要确保所有新引入的类型都是 up-to-date。
我不确定如何将 if/case
与 where exists
语句结合起来。以下所有字段都位于 t_phone
这是设置 - 声明了一个 phone 临时变量
Declare @phone varchar(25)
`select @phone = ....`
我们需要说的是对于给定的 customer_no
如果 phone_type
(来自 t_phone
)对于 customer_no 存在,则类型为 25 使用 phone_no 关联类型 = 25,否则使用类型 2。
例如
phone_no type customer_no
1234567890 2 4
0987654321 25 4
6537327345 2 8
基于上面的例子,对于客户 4 我们想设置 @phone = 0987654321,因为存在类型 25,但是对于客户 8 我们想使用类型 2,因为没有替代的 25类型。
如果只有 2 和 25 类型,您可以像下面这样 SELECT MAX()
:
Select t.phone_no
from t_phone t
where t.type = (select max(ti.type)
from t_phone ti
where ti.customer_no=t.customer_no
and ti.type in (2,25))
由于您只与一个客户打交道,而您想要的唯一值是类型 2 和 25,像这样简单的事情怎么样。
select top 1 phone_no
from t_phone
where customer_no = @Customer
order by
case type when 25 then 2
when 2 then 1
else 0 end
declare @phone varchar(25)
select @phone = CASE t0.[type]
WHEN 25 THEN t1.phone_no
WHEN 2 then t2.phone_no
else 0
END
from tbl t0
left outer join tbl t1 on t1.type = 25 and t1.customer_no = t0.customer_no
left outer join tbl t2 on t2.type = 2 and t2.customer_no = t0.customer_no
您可以通过引入一个名为 type_priority
的 table 来使其更易于实施 和 维护。这将有两列:type
和 priority
。对于 type=25
,priority
将是最高的 10,对于 type=2
,priority
将是 1。
然后,当您 select 加入此 table 时,按 priority DESC
订购并选择 top 1
。
select top 1 @phone = phone_no
from t_phone ph
join type_priority tp on tp.type = ph.type
where customer_no = @Customer
order by tp.priority desc
这种数据驱动的方法更易于维护,因为如果您引入其他类型,只需使用适当的 priority
将行添加到 type_priority
table 并且 sql 语句继续一样工作。
请注意,对于 type_priority
table 中缺失的 types
,记录将不会被 select 编辑。因此,您需要确保所有新引入的类型都是 up-to-date。