【问题标题】:T-SQL: Evaluate ISNUMERIC before joinT-SQL:在加入前评估 ISNUMERIC
【发布时间】:2016-10-10 15:38:15
【问题描述】:

我正在处理一个 SQL 查询,我需要根据 ISNUMERIC 返回值进行过滤。 ISNUMERIC 很重要,因为在我的联接中,我将值隐式转换为“int”,因此 VARCHAR 是禁忌。

我查看了应该处理查询的顺序,处理 FROM,然后处理 WHERE 之前的 ON。有没有一种方法可以建议在不使用子查询的情况下首先评估 ISNUMERIC?我不反对子查询,我只是想知道。

SELECT l.* FROM [dbo].[CRM_SD_Working_1] l
LEFT JOIN [dbo].[CRM_SD_Working_1] r  ON l.[PlzVon] = r.[PlzBis] + 1
WHERE 
ISNUMERIC(l.[PlzVon]) = 1 
AND ISNUMERIC(l.[PlzBis]) = 1 
AND l.PlzVon <> l.PlzBis
AND r.ID IS NULL

【问题讨论】:

  • 该子句不应该是ISNUMERIC(r.[PlzBiz] = 1吗?用 r。而不是 l.?
  • 在 = 符号两侧的 JOIN 中加入 CASE 语句以测试 IsNumberic()。
  • PlzVonPlzBis 栏目中是否有类似'$5.1', '1.4e1','4d9' 的数据?
  • 甚至不确定您是否可以使用子查询来做到这一点。查询优化器选择处理顺序。 #temp 表应该可以工作。

标签: sql-server tsql ansi-sql


【解决方案1】:

你能不能把isnumeric 放到你的on 标准中?

这对我有用:

declare @a table(a nvarchar(10))
declare @b table(b nvarchar(10))

insert into @a values('1'),('2'),('3'),('4'),('a'),('5')
insert into @b values('1'),('2'),('3'),('5'),('6'),('b')

select *
from @a a
    left join @b b
        on(case when isnumeric(a.a) = 1
                then a.a
                else null
                end
           =
           case when isnumeric(b.b) = 1
                then b.b + 1
                else null
                end
            )

如果您使用的是 2012 或更高版本,也可以使用try_convert

declare @a table(a nvarchar(10))
declare @b table(b nvarchar(10))

insert into @a values('1'),('2'),('3'),('4'),('a'),('5')
insert into @b values('1'),('2'),('3'),('5'),('6'),('b')

select *
from @a a
    left join @b b
        on(try_convert(int, a.a) = try_convert(int, b.b)+1
          )

【讨论】:

  • 问题是 b.b + 1
  • 将它们都设为 nvarchar 并在 a 中进行聊天,但它失败了
  • @Paparazzi 为提醒干杯,答案已更新。
【解决方案2】:

我认为这不能保证有效,但适用于这些数据
iamdave 的回答对我来说看起来不错

declare @a table(a varchar(10))
declare @b table(b varchar(10))

insert into @a values('1'),('2'),('3'),('4'),('5'),('6'),('c')
insert into @b values('1'),('2'),('3'),('5'),('6'),('a')

select *
from 
( select a from  @a where isnumeric(a) = 1 ) aa
left join 
( select b from  @b where isnumeric(b) = 1 ) bb
on aa.a = bb.b + 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多