У меня есть данные в столбце, который содержит значения для различных полей из приложения, и все эти поля объединены в одно поле на стороне базы данных и разделены запятыми. Если поле в приложении пустое, то значение между двумя запятыми будет пустым.

Мне нужен оператор выбора, чтобы выбрать каждое из отдельных полей, если они заполнены. Я хотел бы указать каждое поле как переменную, которую я объявлю в верхней части инструкции.

Пример строки в поле базы данных:

, «FIELD1», «FIELD2», «FIELD3», FIELD4, FIELD5, FIELD6 ,,,, «FIELD10», FIELD11, FIELD12, FIELD13

Как видите, поля 7–9 в этом примере были пустыми, поэтому они остаются пустыми в строке.

Мне просто нужен способ выборочно выбрать нужное мне поле, используя запятые в качестве маркера. Строка всегда начинается с запятой, поэтому field1 всегда следует после первой запятой.

Я надеюсь в этом есть смысл!

0
Chris 21 Авг 2014 в 15:58
 – 
Donal
21 Авг 2014 в 16:00
Нормализуйте схему своей базы данных как минимум до 1NF, и у вас вообще не будет этой проблемы! (Этот совет является долгосрочным решением и, вероятно, не сразу пригодится вам.)
 – 
stakx - no longer contributing
21 Авг 2014 в 16:58

1 ответ

Лучший ответ

Попробуй это:

DECLARE @STRING VARCHAR(255) = ',"FIELD1","FIELD2","FIELD3",FIELD4,FIELD5,FIELD6,,,,"FIELD10",FIELD11,FIELD12,FIELD13'

DECLARE @FieldToReturn INT = 12 -- Pick which field you want

SET @STRING = RIGHT(@STRING, LEN(@STRING) - 1) + ',' -- Strip leading comma & add comma to the end
WHILE @FieldToReturn > 1 
   BEGIN
     SET @STRING = SUBSTRING(@STRING,PATINDEX('%,%',@STRING), LEN(@STRING)) 
     SET @FieldToReturn = @FieldToReturn - 1
     SET @STRING = RIGHT(@STRING, LEN(@STRING) - 1)
   END

SELECT SUBSTRING(@STRING,0,PATINDEX('%,%', @STRING))

Если поле не заполнено, будет возвращено пустое поле.

Изменить: я знаю, что мог бы поместить все манипуляции со строкой в ​​одну строку в WHILE, но решил не делать этого для удобочитаемости ... для меня это более важно, чем возможность крошечных накладных расходов в этом примере

1
How 'bout a Fresca 21 Авг 2014 в 16:56
Это прекрасно, последнее поле пропущено, потому что после него нет запятой, но когда я устанавливаю переменную @STRING, я просто добавляю запятую в конец имени поля, и это работает. Большое спасибо за это
 – 
Chris
21 Авг 2014 в 16:31
Без проблем! Хороший улов! Я отредактировал свой ответ, просто добавив запятую в той же строке, что и начальную запятую.
 – 
How 'bout a Fresca
21 Авг 2014 в 16:55