【发布时间】:2015-09-09 15:50:28
【问题描述】:
有一个实例,我的过滤器被动态插入到我的 SQL 查询中,有时无法事先判断它们是 int 还是 varchar。有没有办法允许使用 CASE WHEN 声明?
在我的表中(ent 表示实体),公司列是字符串/varchar,entid 列是 int。我似乎无法让这个 CASE IsNumeric 语句适用于 int 是过滤器或字符串是过滤器的情况。
这行得通:
select
ent.company
from
ent
where
ent.company in
(CASE
WHEN IsNumeric(CONVERT(VARCHAR(100), 'ABIS, Inc.')) = 0
THEN CONVERT(VARCHAR(100), 'ABIS, Inc.')
ELSE '99'
END,
CASE
WHEN IsNumeric(CONVERT(VARCHAR(100), 'Schulte Building Systems')) = 0
THEN CONVERT(VARCHAR(100), 'Schulte Building Systems')
ELSE '1423'
END)
这是不工作:
select
ent.company
from
ent
where
ent.entid in
(CASE
WHEN IsNumeric(CONVERT(VARCHAR(100), 'ABIS, Inc.')) = 0
THEN CONVERT(VARCHAR(100), 'ABIS, Inc.')
ELSE '99'
END,
CASE
WHEN IsNumeric(CONVERT(VARCHAR(100), 'Schulte Building Systems')) = 0
THEN CONVERT(VARCHAR(100), 'Schulte Building Systems')
ELSE '1423'
END)
...但是对于 int equals,如果我将 0 更改为 1,它就可以工作(如果我使用 company equals,它什么也不返回)。知道为什么会失败吗?
【问题讨论】:
-
显示两者的执行计划,我假设在
CASE发生之前有演员表。 -
这是整个查询,没有演员表。你要什么?
-
我的意思是this,不是您的查询,而是查询优化器将如何执行它们
-
那你建议我怎么改?
-
没关系,在 CASE 的第二个查询中,您返回
NVARCHAR并与导致此错误的INT进行比较。
标签: sql sql-server tsql case-when sql-convert