SQL Where exists case 语句

Posted

技术标签:

【中文标题】SQL Where exists case 语句【英文标题】:SQL Where exists case statement 【发布时间】:2016-01-21 17:29:03 【问题描述】:

我不确定如何将 if/casewhere exists 语句结合使用。以下所有字段均位于t_phone

这是设置 - 声明了一个电话临时变量

Declare @phone varchar(25)

`select @phone = ....`

我们需要说的是,对于给定的customer_no,如果该 customer_no 存在 phone_type(来自 t_phone),类型为 25 使用与 type = 25 关联的 phone_no,否则使用类型 2。

例如

phone_no          type           customer_no
1234567890          2                  4
0987654321          25                 4
6537327345          2                  8

基于上面的客户 4 示例,我们想要设置 @phone = 0987654321,因为存在类型 25,但是对于客户 8,我们想要使用类型 2,因为没有替代的 25 类型。

【问题讨论】:

你有决定重要性顺序的东西吗?是在表中还是在可用的地方定义了 25 的优先级高于 2? 【参考方案1】:

如果 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。 如果您将其添加到您的标准中,这应该可以。我已经更新了答案 我收到此错误消息:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 我不得不在选择的第一/主要部分添加另一个 where 子句并让它工作。【参考方案2】:

您可以通过引入一个名为type_priority 的表来使其更易于实现。这将有两列:typepriority。对于type=25priority 的最大值为 10,type=2 priority 的最大值为 1。

然后,当您选择加入此表时,按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 表,然后 sql 语句将继续工作。

请注意,对于type_priority 表中缺少的types,将不会选择记录。因此,您需要确保它与所有新引入的类型都是最新的。

【讨论】:

我真的很喜欢这个想法,并且必须对实现它做更多的研究——如果我们可以添加额外的临时表,我必须在内部获得批准。谢谢你的信息【参考方案3】:

既然您只与一个客户打交道,并且您想要的唯一值是类型 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

【讨论】:

这是一个完全不同/错误的电话号码。 (过期一个)我不确定它为什么这样做。 哎呀... order by 最后应该有一个 desc。 :)【参考方案4】:
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

【讨论】:

这似乎是在查看正确的数据元素 - 但发生了两件事,一是运行需要更长的时间,因为此代码是由许多可能不是的许多过程调用的函数的一部分一件好事 - 但目前更大的问题 - 我收到错误:Conversion failed when converting the varchar value '(414) 444-4444 ext.4444' to data type int. 确保您的变量或数据类型不是 int,因为字符 (,),-,。不是整数而是字符。 t1 和 t2.phone 字段是 varchars - customer_no 是整数,但其余数据都是 varchars。我什至不确定它在哪里尝试转换整数 “类型”是 varchar 字段吗?如果是这样,那将是由于连接部分中的 case 语句和 on 子句的问题。您必须将其更改为“25”和“2”。 type 是 int,但它似乎正在尝试将返回的手机转换回 int 类型

以上是关于SQL Where exists case 语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL 在 WHERE IN 子句中使用 CASE 语句

sql语句借助case when实现自动拼装where条件

sqlserver case when问题

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

SQL:WHERE 子句中的 IF/CASE 语句