Надеюсь, кто-то может мне помочь. У меня есть таблица, в которой есть столбец со значениями, которые либо имеют одно значение, либо значение, разделенное запятой, и все они являются однобуквенными значениями. То, что я хочу выполнить, чтобы иметь возможность (на уровне презентации) отображать фактические имена для буквенных значений. Вот что я хочу
Оригинальные результаты
PersonID MentorList 1 A 2 K, L 3 F
Что я хочу
PersonID MentorList 1 Big Brother/Big Sister 2 Youth Motivators, Other Mentoring 3 Gear Up
Я пробовал следующую инструкцию SQL, но не создавал результат, который я хочу
SELECT PersonID, REPLACE(REPLACE(MentorList, 'A', 'Big Brother/Big Sister'), 'B', 'Best Buddies') AS MentorList FROM Mentors
Я получаю следующее
PersonID MentorList 1 Best Buddiesig Best Buddiesrother/Best Buddiesig Sister 2 Youth Motivators, Other Mentoring 3 Gear Up
Как вы можете видеть, оператор запроса заменяет все Bs "Лучшими друзьями" в первой строке. Как мне заставить его работать так, как я хочу?
Спасибо в advace...
Если вы действительно хотите пойти с цепочкой REPLACE, сначала замените каждую букву на то, что не имеет шансов вмешиваться (например, #A, #B,...), а затем замените #A, #B,... фактическим расширенный текст, который вы хотите.
Но почему у вас нет этих значений, доступных отдельно? зачем хранить это как объединенную строку?
Вероятно, вы должны иметь Table Mentor с MentorLetter в качестве первичного ключа и поле MentorFullName. Затем таблица ссылок с (MentorLetter, PersonId), чтобы иметь больше, чем Mentor per Person.
Удачи.
Вот пример, который я создал, надеюсь, что это поможет или поможет вам решить ваше требование:
-- create a temp table to store Letters and their description
CREATE TABLE #Test1
(
ID int identity(1,1),
Letter varchar(10),
LetterDescription varchar(100)
)
GO
--Insert letter into temp table
INSERT INTO #Test1(Letter, LetterDescription)
SELECT 'K', 'Youth Motivators'
INSERT INTO #Test1(Letter, LetterDescription)
SELECT 'L', 'Other Mentoring'
INSERT INTO #Test1(Letter, LetterDescription)
SELECT 'F', 'Gear Up'
--@Value is just a variable I use to test, your can replace this with a table
DECLARE @Value VARCHAR(20)
SELECT @Value = 'K'
-- SELECT @Value = 'K,L'
--Query to do the job
SELECT @Value AS AcualChar,
CASE WHEN Desc2 IS NULL THEN Desc1 ELSE Desc1 + ','+ Desc2 END AS MentorList
FROM
(
SELECT T.LetterDescription AS Desc1, y.Desc2 FROM
(
SELECT
CASE WHEN Charindex(',', @Value) > 0 THEN Substring(@Value, 1,Charindex(',', @Value)-1) ELSE @Value END AS Letter1
) AS L
JOIN #Test1 AS T ON L.Letter1 = T.Letter
FULL OUTER JOIN
(
SELECT T.LetterDescription AS Desc2 FROM
(
SELECT
CASE WHEN Charindex(',', @Value) > 0 THEN Substring(@Value, Charindex(',', @Value)+1, LEN(@Value)) ELSE '' END Letter2
) AS L
JOIN #Test1 AS T ON L.Letter2 = T.Letter
) as y ON 1=1
) X
GO
--Drop the temp table
DROP TABLE #Test1