Access SQL Query - выбор средней секции для множества различных типов строк - PullRequest
2 голосов
/ 17 января 2012

Как выбрать среднюю секцию строки, когда желаемая секция окружена одним и тем же символом "/", а начало строки не всегда совпадает с индексом?

e.g. "NWST/330/23/WT6" to "330" 

and  "NTW/1010/43/TY7" to "1010"

and  "TYQT/99/WYT3"    to "99"

Я пробовал комбинации функций SQL, включая CharIndex, Len, Left, Right, Mid, InStr и InStRe, ПОМОГИТЕ!?!?!?!

(

Ответы [ 3 ]

4 голосов
/ 17 января 2012

Вы можете использовать функцию VBA Split ().Вы даете ему строку и указываете, что использовать в качестве разделителя;он возвращает массив подстрок.В вашем случае кажется, что вам нужна вторая подстрока, и поскольку нумерация массива начинается с нуля:

? Split("NWST/330/23/WT6", "/")(1)
330

Вы не можете использовать эту функцию непосредственно в запросе Access, но вы можете создать пользовательскуюфункция, которая его использует.

Public Function CustomSplit(ByVal pInput As String) As String
    CustomSplit = Split(pInput, "/")(1)
End Function

Затем из окна Immediate:

? CustomSplit("NWST/330/23/WT6")
330

Таким образом, вы можете использовать CustomSplit () в запросе, который вы запускаете из сеанса Access.Однако, если вы используете какой-либо другой метод (классический ASP, Dot.Net и т. Д.) Для запроса базы данных Access, пользовательские функции недоступны, поэтому вам придется использовать другой подход.

Итакесли ваш текст находится в поле с именем raw_text, запрос может быть таким:

SELECT
    raw_text,
    CustomSplit(raw_text) AS middle_section
FROM YourTableNameHere;

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

SELECT
    raw_text,
    Mid(Left(raw_text, InStr(InStr(1, raw_text, "/") + 1,
        raw_text, "/") - 1), InStr(1, raw_text, "/") + 1)
        AS middle_section
FROM YourTableNameHere;

Любой из этих запросов выдает это в качестве вывода:

raw_text         middle_section
NWST/330/23/WT6  330
NTW/1010/43/TY7  1010
TYQT/99/WYT3     99
0 голосов
/ 17 января 2012

У меня нет доступа, но это должно сработать или, по крайней мере, приблизить вас:

=MID(<str>,INSTR(1,<str>,"/")+1,INSTR(INSTR(1,<str>,"/")+1,<str>,"/")-1)

Вот как это сделать в Excel (который я тестировал)

=MID(A4,SEARCH("/",A4,1)+1,SEARCH("/",A4,SEARCH("/",A4)+1)-SEARCH("/",A4)-1)

и SQL (который я тоже тестировал)

declare @theStr VARCHAR(200)
set @theStr = 'NWST/330/23/WT6'

select SUBSTRING(@theStr,charindex('/',@theStr)+1,CHARINDEX('./',@theStr,2)+
       charindex('/',@theStr)-2)
0 голосов
/ 17 января 2012

ниже должно это сделать.

declare @input varchar(255);
declare @input2 varchar(255)
set @input = 'NTW/1010/43/TY7'

set @input2 = substring(@input,charindex('/', @input) + 1, len(@input))

select substring(@input2, 0, charindex('/', @input2))

едва ли не самый элегантный, но функциональный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...