【问题标题】:Is there a better way to write this query to short-circuit the 2nd condition?有没有更好的方法来编写这个查询来短路第二个条件?
【发布时间】:2012-01-17 07:27:30
【问题描述】:

以下类似于我需要将字段转换为类型并对其进行评估的查询,并且我想忽略具有无法转换为目标数据类型的数据的行。

select * from MyTable
where case when isnumeric(SomeField) = 1 then SomeField else null end > 1

因此,在上面的示例中,我能够测试大于 1 的值,同时避免在 SomeField 中存在任何非数字字段时会导致的转换错误。我对这个解决方案没意见,但我只是想知道是否有更好的方法来做到这一点?

【问题讨论】:

  • 您对输入该数据库的数据有任何控制权吗?只是好奇为什么您必须首先担心数据类型。
  • 这是一个将数据从csv文件导入sql表的应用程序。因此,我会根据目标字段的数据类型检查源字段中是否有任何无效数据(将被截断,数字字段中的字符数据等),并在 datagridview 中隐藏这些记录用户可以在导入前进行调整。
  • 但是,是的,如果我根据我提供的信息阅读您的回复,我也会投票赞成 :) 好吧,无论如何我都会投票赞成,因为这是常识,但不幸的是不能适用在这种情况下。
  • 您是否尝试过查看查询分析器的输出?喜欢:stackoverflow.com/questions/3983386/…
  • 你的意思是得到执行计划?这是 100% 的表扫描。性能还可以,但我只是好奇是否有任何我忽略的内置 sql 约定或更简洁的方式来执行此操作。还是你的意思是别的?

标签: sql sql-server performance


【解决方案1】:

我在查询中使用 where 条件时收到错误“超出最大整数值”。不过,我的数据库中有一些非常大的数字,也许这对你没有用。

下面列出了处理大量数字的替代方法:

where isnumeric(SomeField) = 1 and convert(numeric(18,0),SomeField) > 1

isnumeric() 检查必须在 convert() 之前。

在性能方面它们大致相同。

【讨论】:

  • 你不能阻止 sql 在 isumeric() 函数之前运行 convert() 函数,如果它不能转换,那么它会抛出一个错误,这是我想要避免的.我的数据库中没有任何特别大的数字,但无论如何我都会给你 +1 以提醒我注意 isumeric 的大小限制。
【解决方案2】:

我得出的结论是没有更好的方法来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多