Member 13811831 Ответов: 1

Разбор 1 поля на 2 или 1 в зависимости от того, разделено ли оно дефисом или нет


У меня есть поле лабораторных результатов, которые либо выглядят как "5.6-6.3", либо как "положительные" на основе выполненного лабораторного теста. Меня попросили разделить дефисные результаты на 2 поля HighRange, LowRange. Там, где результат не переносится через дефис, они хотят получить результат в 3-м файле = Альфа. Я могу получить дефисные результаты, разделенные подстрокой в следующем коде:
select top 100 RESULT_NORMAL_RANGE,
	SUBSTRING(RESULT_NORMAL_RANGE,1,CHARINDEX('-',RESULT_NORMAL_RANGE) -1) LowRange,--minus one to remove the dash
    SUBSTRING(RESULT_NORMAL_RANGE,CHARINDEX('-',RESULT_NORMAL_RANGE) +1 ,LEN(RESULT_NORMAL_RANGE)) HighRange
      	from HPSITE.LAB_RESULT
	WHERE RESULT_NORMAL_RANGE LIKE '%-%'

То, с чем я борюсь, - это когда результат не переносится через дефис, чтобы заполнить 3-е поле "Альфа". Я думаю, что заявление по делу может сработать. Пожалуйста, посоветуйте!

Спасибо за вашу помощь.

Что я уже пробовал:

Я пробовал искать и гуглить решение, но так и не нашел того, что мне нужно.

1 Ответов

Рейтинг:
2

Wendelius

Не уверен, правильно ли я понимаю вопрос, но чтобы разделить значения, рассмотрим следующий пример

CREATE TABLE #test1 (
  SomeData varchar(100)
);

INSERT INTO #test1 VALUES 
('5.6-6.3'),
('7.8'),
('1.2-3.4'),
('-9.9'),
('0.0-'),
('> 60');

SELECT 
   SomeData,
   CHARINDEX( '-', SomeData, 0) AS Position,
   CASE
      WHEN CHARINDEX( '-', SomeData, 0) = 0 
	     THEN SomeData
   END AS Alpha,
   CASE
      WHEN CHARINDEX( '-', SomeData, 0) > 1 
	     THEN SUBSTRING(SomeData, 0,CHARINDEX( '-', SomeData, 0))
   END AS Low,
   CASE
      WHEN CHARINDEX( '-', SomeData, 0) > 0 
	  AND CHARINDEX( '-', SomeData, 0) < LEN(SomeData) 
	     THEN SUBSTRING(SomeData, CHARINDEX( '-', SomeData, 0) + 1, 9999)
   END AS High
FROM #test1;

Результат был бы таков
SomeData  Position  Alpha  Low   High
--------  --------  -----  ----  ----
5.6-6.3   4         NULL   5.6   6.3
7.8       0         7.8    NULL  NULL
1.2-3.4   4         NULL   1.2   3.4
-9.9      1         NULL   NULL  9.9
0.0-      4         NULL   0.0   NULL
> 60      0         > 60   NULL  NULL


ДОПОЛНЕНИЕ:
--------
Добавлена проверка на - существование в высоком тесте


Member 13811831

Спасибо. Он работает для диапазонов, где есть максимумы и минимумы, но еще не совсем подходит для Альфы.

Вот этот код:
выберите RESULT_NORMAL_RANGE,
ДЕЛО
КОГДА CHARINDEX( '-', RESULT_NORMAL_RANGE, 0) = 0, ТО RESULT_NORMAL_RANGE
Конец как Альфа,
CHARINDEX('-', RESULT_NORMAL_RANGE, 0) как позиция,
ДЕЛО
Когда CHARINDEX( '-', RESULT_NORMAL_RANGE, 0) > 1
ЗАТЕМ ПОДСТРОКА(RESULT_NORMAL_RANGE, 0,CHARINDEX( '-', RESULT_NORMAL_RANGE, 0))
Конец как LowRange,
ДЕЛО
Когда CHARINDEX('-',RESULT_NORMAL_RANGE,0)<LEN(RESULT_NORMAL_RANGE)
Затем подстрока(RESULT_NORMAL_RANGE, CHARINDEX( '-',RESULT_NORMAL_RANGE,0) +1, 9999) заканчивается как HighRange

от HPSITE.LAB_RESULT

Пример:
RESULT_NORMAL_RANGE Альфа-позиция LowRange HighRange
>60 >60 0 >60
желтый желтый желтый

Он отображает его как альфа, что правильно, потому что он не содержит '-'. Но он также отображает его в столбце HighRange по какой-то причине.

Пожалуйста, посоветуйте. Еще раз спасибо за вашу помощь!!

Wendelius

Мало вопросов
- Какие еще разделители, кроме - следует принимать во внимание?
- Можете ли вы опубликовать примерные данные. Является ли "> 60 " единственным вариантом или есть и другие?

Wendelius

Пожалуйста, взгляните на модифицированное решение.Это то, что тебе нужно?