Разберите поле, разделенное запятыми, на отдельные поля (MS ACCESS VBA 2003)

Я унаследовал базу данных, в которой поля ввода пользователя хранятся в виде строки, разделенной запятыми. Я знаю. Хромой. Мне нужен способ проанализировать эти поля в запросе SELECT, где есть три сегмента с различным количеством символов. Вопреки всем рекомендациям, что я вставляю поля в новую таблицу или создаю для этого хранимую процедуру, это то, что я придумал. Мне интересно, видит ли кто-нибудь какой-либо недостаток в том, чтобы сделать это как запрос выбора (где я могу легко преобразовать из строки в анализируемую и обратно по мере необходимости).

Field_A
5,25,89

Итак, чтобы получить левый сегмент, который является наиболее простым:

Field_1: Left$([Field_A],InStr([Field_A],",")-1)

Чтобы получить самый правый сегмент:

Field_3: Right$([Field_A],Len([Field_A])-InStrRev([Field_A],","))

Средний сегмент оказался самым сложным:

Field_2: Mid([Field_A],InStr([Field_A],",")+1,InStrRev([Field_A],",")-InStr([Field_A],",")-1)

Итак, результат:

Field_1   Field_2   Field_3
5           25        89

Есть согласованные мнения?


person TSS    schedule 11.12.2012    source источник
comment
Противодействовать всем рекомендациям по вставке полей в новую таблицу, так почему?   -  person Fionnuala    schedule 11.12.2012
comment
В основном потому, что я был убежден, что МОГУ сделать это с помощью запроса выбора, а не создавать целую новую таблицу. Эти поля, разделенные запятыми, отображаются, вводятся и обновляются пользователем, но бесполезны для меня как менеджера данных. Я хотел иметь возможность быстро переходить с одного запроса на другой, чтобы у меня всегда были данные в реальном времени, когда пользователь обновляет. Не то чтобы повторно запускать maketable - это большая проблема, но иногда о них забывают, когда они являются шагом в нескольких вложенных запросах.   -  person TSS    schedule 12.12.2012
comment
Похоже, вам нужна форма, которая принимает ввод CSV от пользователя, но на самом деле хранит рациональные данные в соответствующей таблице.   -  person HackSlash    schedule 29.04.2019


Ответы (3)


Что ж, если вы настаиваете на том, чтобы пойти по этому пути ... Это может быть проще и более адаптируемым. Создайте функцию в модуле:

Public Function GetValueFromDelimString(sPackedValue As String, nPos As Long, 
                                        Optional sDelim As String = ",")

Dim sElements() As String

sElements() = Split(sPackedValue, sDelim)
If UBound(sElements) < nPos Then
    GetValueFromDelimString = ""
Else
    GetValueFromDelimString = sElements(nPos)
End If

End Function

Теперь в вашем запросе вы можете получить любое поле в строке, например: GetValueFromDelimString ([MultiValueField], 0) AS FirstElement, GetValueFromDelimString ([MultiValueField], 1) AS SecondElement и т. Д.

Я чувствую, что покупаю пиво для несовершеннолетних, поощряя такое поведение :)

person Peter Lake    schedule 01.02.2013
comment
Спасибо, вы оба правы, что это далеко не идеально. Но я видел, как люди борются с этой проблемой во многих обсуждениях, и думал, что опубликую этот вариант пластыря, который сработал для меня как быстрое решение. Функция, которую предлагает Питер, намного элегантнее моего запроса. Спасибо за добавленный вклад! - person TSS; 04.02.2013
comment
Милый Питер !! - person ASH; 27.07.2017

Похоже, вы не запрашиваете информацию о том, как разбирать поля, разделенные запятыми, на разные поля, а скорее ищете людей, которые поддержат вас в вашем решении сделать это, да?

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

В краткосрочной перспективе это простой способ достичь ваших целей в качестве менеджера данных, я вам это гарантирую. Но в качестве долгосрочного решения оно просто добавляет еще один уровень сложности к тому, что кажется плохо спроектированной базой данных (я знаю, что последнее не ваша вина - я тоже унаследовал свою долю «хромых» баз данных).

Поэтому я аплодирую вам за то, что «работа сделана», но я бы посоветовал вам прислушаться к «всем рекомендациям, которые вы вставляете в поля в новую таблицу» - это хорошие рекомендации. Это потребует большего планирования и усилий, но в конечном итоге у вас будет лучшая база данных. И это сделает все, что вы делаете с ним, проще, быстрее и надежнее.

person Lokerim    schedule 01.02.2013

Это старая ветка, но кто-то может поискать в ней. Вы также можете использовать ту же стратегию, что и запрос на обновление. Таким образом, вы можете сохранить исходный CSV и получить 3 новых поля назначения, которые можно вычислить и пересчитать в зависимости от целей вашего приложения.

person vedran    schedule 19.04.2019