【问题标题】:SQL Query WHERE equals int or varchar without breaking?SQL 查询 WHERE 等于 int 或 varchar 而不中断?
【发布时间】:2015-09-09 15:50:28
【问题描述】:

有一个实例,我的过滤器被动态插入到我的 SQL 查询中,有时无法事先判断它们是 int 还是 varchar。有没有办法允许使用 CASE WHEN 声明?

在我的表中(ent 表示实体),公司列是字符串/varcharentid 列是 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


【解决方案1】:

解决了。我从来没有问过实际的列 - 只是过滤器。

select ent.entid, ent.company from ent where 

ent.entid in
(
    CASE IsNumeric(entid) WHEN 1 then '99' else 'ABIS, Inc.' End,
    CASE IsNumeric(entid) WHEN 1 then '1423' else 'Schulte Building Systems' End    
)

select ent.entid, ent.company from ent where 

ent.company in
(
    CASE IsNumeric(company) WHEN 1 then '99' else 'ABIS, Inc.' End,
    CASE IsNumeric(company) WHEN 1 then '1423' else 'Schulte Building Systems' End  
)

两者都有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2013-10-30
    • 2014-03-17
    • 2011-09-03
    相关资源
    最近更新 更多