SQL CASE isNumeric 具有多个值?

Posted

技术标签:

【中文标题】SQL CASE isNumeric 具有多个值?【英文标题】:SQL CASE isNumeric with multiple values? 【发布时间】:2015-10-22 17:12:42 【问题描述】:

我有一个实例,有时我们不确定是否按名称文本或名称 ID 进行过滤。我已经用案例陈述和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')。如何用 case 语句解决这个问题?

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)

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

【问题讨论】:

rtresource.id in (183, 23) or rtresource.rname in ('Jane Thompson','John Doe') ..这不是过滤器吗?为什么需要case 表达式? 我真的很惊讶“这太棒了”,因为你的问题被标记为 mysql 并且 MySQL 中没有 IsNumeric() 函数。 @GordonLinoff..它是mysqli 【参考方案1】:

您必须为列表中的每个值重复 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')

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

【讨论】:

【参考方案2】:

想通了。跳过案例,而是:

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

【讨论】:

以上是关于SQL CASE isNumeric 具有多个值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 使用具有多个 IS NULL、IS NOT NULL 的 CASE 语句

每个 'when' 块中具有多个值的 case 语句

具有一个条件和多个结果的 SQL CASE

具有多个值的 CASE 语句

SQL大圣之路笔记——SQL 获取excel中的数据

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本