1

我有一个实例,有时我们不确定按名称文本或名称 ID 进行过滤。我已经用 case 语句解决了这个问题,并且isnumeric. 例如,我们同时拥有 id 和 name 值,但我们不确定要求过滤哪一列。rtresource.id是数字,在这种情况下,我们有可以使用的值'183'。如果rtresource.rname (varchar)正在尝试过滤,那么我们有那个 id 'Jane Thompson' 的 rname。

所以过滤器是

rtresource.id=183

或者

rtresource.rname='Jane Thompson'

反而变成

rtresource.rname in (CASE IsNumeric(rtresource.rname) WHEN 1 then '183' else 'Jane Thompson' End) 

这很棒。问题是传递了一组以上的 id/rname。通常,我们会问任何一个rtresource.id in (183, 23) or rtresource.rname in ('Jane Thompson','John Doe')。如何用案例陈述解决这个问题?

rtresource.rname in (CASE IsNumeric(rtresource.rname) WHEN 1 then ('183','23') else ('Jane Thompson','John Doe') End)

上面抱怨值之间的逗号。我也试过:

rtresource.rname in (CASE IsNumeric(rtresource.rname) WHEN 1 then ('183'+','+'23') else ('Jane Thompson'+','+'John Doe') End)

这也不起作用。想法?感谢您提前提供任何帮助。

4

2 回答 2

0

您必须为case列表中的每个值重复:

where rtresource.rname in (
  CASE IsNumeric(rtresource.rname) WHEN 1 then '183' else 'Jane Thompson' End,
  CASE IsNumeric(rtresource.rname) WHEN 1 then '23' else 'John Doe' End
)

或者因为这些值不相交,所以:

where rtresource.rname in (183, 23, 'Jane Thompson', 'John Doe')

这将执行得更好,因为它将使用列的索引(如果有的话),并且更容易编码、理解和扩展。

于 2015-10-22T17:18:38.140 回答
0

弄清楚了。跳过案例,而是:

(IsNumeric(rtresource.rname) = 1 and rtresource.rname in ('183','23')) 或 (IsNumeric(rtresource.rname) != 1 and rtresource.rname in ('Jane Thompson','John Doe' ))

于 2015-10-22T17:26:13.720 回答