Нужна помощь в понимании запроса, включающего предложения "case" и "select into" - PullRequest
1 голос
/ 31 декабря 2011

Я озадачен выводом следующего запроса:

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. Таблица Location содержит 25385 записей, но возвращается только 8157 записей. Почему записи отфильтровываются?

  2. Когда я пытаюсь добавить в dbo.ModifiedLocation вышеупомянутый запрос, происходит сбой со следующей ошибкой: «Недопустимый параметр длины, переданный в функцию LEFT или SUBSTRING». Сообщение довольно наглядное, но почему возникает эта ошибка, когда я добавляю предложение in? Почему запрос выполняется нормально без предложения into?

Редактировать Я хотел бы объяснить, чего я пытаюсь достичь. Исходный набор данных имеет две интересующие меня колонки: 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 для SQL Server. Когда я переключился на SSMS и удалил «into dbo.ModifiedLocation», запрос вызвал знакомую ошибку «Недопустимый параметр длины, переданный функции LEFT или SUBSTRING». Это отвечает на мой второй вопрос. Я предполагаю, что если я разрешу эту ошибку, я получу желаемый результат. Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 31 декабря 2011

Чтобы вставить в существующую таблицу, вам нужно INSERT INTO dbo.ModifiedLocation SELECT ...

Синтаксис SELECT ... INTO dbo.ModifiedLocation FROM ... предназначен для создания и вставки таблицы.


Что касается количества возвращенных записей. Если у вас нет предложения JOIN, WHERE, GROUP BY или DISTINCT, это должно вернуть ровно столько же записей, сколько существует в исходной таблице.

Это именно тот запрос, который вы выполняете?

...