JOIN ON子句中的T-SQL Case语句

Jar*_*red 6 sql t-sql sql-server sql-server-2005

我试图在一个JOIN ON子句中构建一个case/if语句.

LEFT JOIN [CTSTRC] [Statuses] ON RIGHT([Statuses].[STRID], 3) = [CTE].[F61]
Run Code Online (Sandbox Code Playgroud)

问题是该列[Statuses].[STRID]包含文本和数字.我将它与之比较的列[CTE].[F61]是一个整数.

有没有办法检测列[Statuses].[STRID]是否有字符或数字,如果是字符,那么将其设置为0?

这是一个伪查询来帮助:

LEFT JOIN [CTSTRC] [Statuses] ON RIGHT((CASE [Statuses].[STRID] WHEN TEXT THEN 0 ELSE CAST([Statuses].[STRID] AS INT) END), 3) = [CTE].[F61]
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?

谢谢!

Con*_*rix 16

你正在寻找IsNumeric,但它并不总是有效(+, - 和.是数字)所以你需要使用GBN描述的解决方案,即将.0e0添加到你的varchar

LEFT JOIN [CTSTRC] [Statuses] ON 
    (CASE WHEN ISNUMERIC(RIGHT([Statuses].[STRID], 3) + '.0e0) = 1 
          THEN  CAST(RIGHT([Statuses].[STRID], 3) AS INT) 
          ELSE 0  END) = [CTE].[F61] 
Run Code Online (Sandbox Code Playgroud)

  • 修复这个可怕设计的正确方法是将字符串从数字拆分为两列,如果不可能(遗留系统),最好创建一个持久计算列,如果需要使用索引.我在下面的答案中详述了这一点. (2认同)