需要帮助理解涉及“case”和“select into”子句的查询

时间:2011-12-31 00:29:09

标签: sql tsql sql-server-2008r2-express

我对以下查询的输出感到困惑:

select 
  'Eq Type' =
  case
    when 
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) = 
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type])) 
    then
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1)
    when
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) <> 
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type]))
    then
      replace([Eq Type], '-', '')
    else
      null
  end,
  'Failure_Class' =
  case
    when charindex('-', [Eq Type]) <> 0 and
      (substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) = 
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type])))
    then
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1)
    when charindex('-', [Eq Type]) <> 0 and
      (substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) <>
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type])))
    then
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) +
      '\' +
      replace([Eq Type], '-', '')
    when CHARINDEX('-', [Eq Type]) = 0
    then 
      Failure_Class
    else
      null
  end
from dbo.Location
  1. 位置表包含25385条记录,但只返回8157条记录。为什么记录被过滤掉了?

  2. 当我尝试将dbo.ModifiedLocation添加到上面的查询时,它失败并出现以下错误:“传递给LEFT或SUBSTRING函数的长度参数无效”。该消息非常具有描述性,但是当我添加into子句时,为什么会出现此错误?为什么在没有into子句的情况下正常执行查询?

  3. 修改 我想解释一下我想要实现的目标。原始数据集有两个我感兴趣的列,Eq Type和Failure_Class。数据如下:

    Eq Type, Failure_Class
    ACCU-ACCU, ACCU
    AUX-AUX, AUX
    VA-BA, VA
    VA-CH, VA
    IP-LS, IP
    null, null
    VE, VE
    JB, JB
    VA, null
    

    因为数据是手工维护的,所以它是不一致的。我需要以下格式的数据,以便能够将其导入资产管理系统。

    Eq Type, Failure_Class
    ACCU, ACCU
    AUX, AUX
    VABA, VA\VABA
    VACH, VA\VACH
    IPLS, IP\IPLS
    null, null
    VE, VE
    JB, JB
    VA, VA
    

    编辑2 似乎我发现了这个问题。我在免费软件版本的Toad 5.6 for SQL Server中运行此查询。当我切换到SSMS并删除“into dbo.ModifiedLocation”时,查询引发了熟悉的“传递给LEFT或SUBSTRING函数的无效长度参数”错误。这回答了我的第二个问题。我猜如果我解决了这个错误,我会得到所需的输出。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

要插入现有表格,您需要INSERT INTO dbo.ModifiedLocation SELECT ...

SELECT ... INTO dbo.ModifiedLocation FROM ...语法用于创建表格以及插入表格。


关于返回的记录数。除非您有JOIN,WHERE子句,GROUP BY或DISTINCT,否则它应返回源表中存在的完全相同的记录数。

这正是您正在运行的查询吗?