Получить первый пробел слева от varchar SQL - PullRequest
1 голос
/ 11 января 2012

У меня есть столбец Nvarchar, в котором содержится «Джон Смит»

Я хочу разделить его на «Джон Смит» и «

* 1004». Есть идеи, как это сделать?Я пробовал длину, но она не учитывает оставленные пробелы

Ответы [ 4 ]

3 голосов
/ 11 января 2012

Эта функция в 2 раза возвращает длину строки, включая пробел, для nvarchar:

DATALENGTH(@variable)

Так что LEFT(@variable, LEN(@variable)) и RIGHT(@variable, DATALENGTH(@variable) / 2 - LEN(@variable)) должны работать.

Я предполагаю, что вы используете nvarchar, что это SQL Server ...

1 голос
/ 07 апреля 2012

- РАЗДЕЛИТЬ ИЗОБРАЖЕНИЕ ИЗ ДАННЫХ. ЗАМЕНИТЕ ХАРАКТЕР ПОДУШКИ, ЕСЛИ ВАМ НРАВИТСЯ

DECLARE @js varchar(50)
DECLARE @M INT
DECLARE @I INT
DECLARE @C CHAR
DECLARE @WORD VARCHAR(50)
DECLARE @LPAD VARCHAR(50)
DECLARE @RPAD VARCHAR(50)
DECLARE @LEFT_PADDING_CHARACTER CHAR
DECLARE @RIGHT_PADDING_CHARACTER CHAR
DECLARE @TERMINATOR_CHARACTER CHAR

-- INIT THE STRINGS
SELECT @LPAD = ''
SELECT @RPAD = ''
SELECT @WORD = ''
SELECT @LEFT_PADDING_CHARACTER = ' '
SELECT @RIGHT_PADDING_CHARACTER = ' '
SELECT @TERMINATOR_CHARACTER = '~'  
SELECT @js = '    John Smith '
SELECT @js = @js + @TERMINATOR_CHARACTER    -- ADD TO CALC THE LENGTH
SELECT @I = 1                               -- FIRST CHARACTER
SELECT @M = LEN(@JS)                        -- LAST CHARACTER

WHILE @I < @M               -- PARSE OUT THE LEFT PADDING
BEGIN
    SELECT @C = SUBSTRING(@js, @I, 1)   
    IF @C = @LEFT_PADDING_CHARACTER SELECT  @LPAD = @LPAD + @C
    ELSE GOTO PARSERIGHTPADDING
    SELECT @I = @I + 1
END

PARSERIGHTPADDING:
SELECT @I = LEN(@JS) -1     -- POINT TO THE LAST CHAR
SELECT @M = 1           -- POINT TO THE FIRST CHAR
SELECT @js = LTRIM(@JS)     -- TRIM OFF THE LEFT PADDING
SELECT @js = REPLACE(@js, @TERMINATOR_CHARACTER, '' -- TRIM OFF THE TERMINATOR

WHILE @M < @I               -- PARSE OUT THE RIGHT PADDING
BEGIN       
    SELECT @C = SUBSTRING(@js, @I, 1)
    IF @C = @RIGHT_PADDING_CHARACTER SELECT  @RPAD = @RPAD + @C
    ELSE GOTO REMOVEPADDINGS
    SELECT @I = @I - 1
END

REMOVEPADDINGS:
SELECT  @WORD = LTRIM(RTRIM(@js))

-- SELECT THE RESULTS TO VIEW THEM @LPAD AND @RPAD SHOULD BE BLANK
SELECT @LPAD [LPAD], @WORD [WORD], @RPAD [RPAD]
1 голос
/ 11 января 2012

Внутри запроса попробуйте:

...
rtrim(MyColumn) NoTrailingSpaces,
right(MyColumn, len(MyColumn) - len(rtrim(MyColumn)) ) TrailingSpacesOnly,
...
0 голосов
/ 11 января 2012

Лут на примере:

DECLARE @js NVARCHAR(MAX) = N'John Smith '
SELECT CASE WHEN RIGHT(@js, 1) = NCHAR(32) THEN SUBSTRING(@js, 1, DATALENGTH(@js)/2-1) ELSE @js END JohnSmith,
 CASE WHEN RIGHT(@js, 1) = NCHAR(32) THEN NCHAR(32) ELSE N'' END Space
...