2012-01-11 55 views
1

我有一個nvarchar列含有「約翰·史密斯」獲取有關VARCHAR SQL左側

我想將其劃分爲「約翰·史密斯」和「」

任何想法如何做的第一空間那?我嘗試了長度,但它沒有考慮取左側位

+1

SQL Server有功能LTRIM(字符串),RTRIM()和SPLIT()functions.It可以在像MySQL或Oracle等SQL執行有所不同,但它們很可能也有類似的功能。 – Acn 2012-01-11 10:27:18

+1

哪個RDBMS? MS SQL Server,還是其他?許多字符串函數都是特定於平臺的。 – 2012-01-11 10:28:09

回答

3

該函數返回的字符串長度的2倍,其中包括空間,對於一個nvarchar:

DATALENGTH(@variable) 

所以LEFT(@variable, LEN(@variable))RIGHT(@variable, DATALENGTH(@variable)/2 - LEN(@variable))應該工作。

我從你的使用nvarchar,這是SQL Server的假設......在例如

+0

LEN回覆數值,未置入左側空格 – AMH 2012-01-11 11:00:08

+0

您的問題中沒有左手空格... – 2012-01-11 11:05:36

+0

對不起右 – AMH 2012-01-11 11:06:34

0

戰利品:

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 
+0

爲什麼NCHAR(32),我不知道填充的長度和字長 – AMH 2012-01-11 11:04:59

+0

NCHAR(32)是空格字符。但你是對的,這不涉及除1之外的任何長度的填充。 – 2012-01-11 11:18:41

+0

你需要將最後一個空間與其他空間分開 - 我做了它,如果你想分割成字符串和它的尾部空間 - 然後我'我會寫信給你。其他。在你的問題中具體和確切 – 2012-01-11 11:22:54

1

內的查詢,請嘗試:

... 
rtrim(MyColumn) NoTrailingSpaces, 
right(MyColumn, len(MyColumn) - len(rtrim(MyColumn))) TrailingSpacesOnly, 
... 
1

- 從數據中刪除填充。更換填充字符如果你喜歡

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]