2017-03-03 81 views
0

我們這些列假設從一列移動基於寬子串的某一部分到另一個

+----+------------------------------------+---------+ 
| ID | ColumnA       | ColumnB | 
+----+------------------------------------+---------+ 
| 1 | ASDKHASDH SDAJH ASKDHAS HDASDHJ 12 | abcd | 
| 2 | asdjahdasd       | efghijk | 
| 3 | dgfwfbiwbf       | null | 
| 4 | sdf        | null | 
+----+------------------------------------+---------+ 

我想要一個查詢,說,如果columnA有大於30 LEN,然後將剩下的columnAcolumnB之後的最後一個空格。

所以..我們將結束與

+----+---------------------------------+---------+ 
| ID | ColumnA       | ColumnB | 
+----+---------------------------------+---------+ 
| 1 | ASDKHASDH SDAJH ASKDHAS HDASDHJ | 12 abcd | 
| 2 | asdjahdasd      | efghijk | 
| 3 | dgfwfbiwbf      | null | 
| 4 | sdf        | null | 
+----+---------------------------------+---------+ 

對不起球員,也許我一直不太清楚。也許這可以幫助:

更新表A 集ColumnA = ColumnA - +「」(最後一個空間後的最後一個子的值), ColumnB =(從ColumnA最後一個空間後的最後一個子值)+ ColumnB 其中LEN(ColumnA)> 30

請注意,ID 1上的12是如何在ColumnB上添加值和空格+ columnB。

回答

1

嘗試下面的查詢,這會給你的第一個30個字母中ColumnA,並且後會追加到ColumnB

SELECT ID 
     ,LEFT(ColumnA,30) AS ColumnA 
     ,RIGHT(ColumnA,(CASE WHEN LEN(ColumnA) > 30 THEN LEN(ColumnA)-30 ELSE 0 END)) + 
      ColumnB AS ColumnB 
FROM TABLE1 

如果你的魔杖ColumnA較大時,在最後一個空位後,分裂超過30,那麼請嘗試下面的查詢,

WITH CTE 
AS 
(
    SELECT * 
      ,(CASE WHEN LEN(ColumnA) > 30 
       THEN CHARINDEX(' ',SUBSTRING(ColumnA,31,LEN(ColumnA))) 
       ELSE 0 END) AS FLAG 
    FROM @TABLE 

) 
SELECT ID 
     ,(CASE WHEN FLAG > 0 THEN LEFT(ColumnA,30+FLAG) 
          ELSE ColumnA END) AS ColumnA 
     ,(CASE WHEN FLAG > 0 THEN SUBSTRING(ColumnA,30+FLAG,LEN(ColumnA)) 
          ELSE '' END)+ ' '+ColumnB AS ColumnB 
FROM CTE 
+1

它不是那麼簡單,OP問ColumnA當大於30.不要在字符分割30 –

+0

很抱歉,但可以成爲最後的空位後,分裂你告訴我邏輯設置在哪裏從ColumnA的最後一個空間獲取子字符串? – Angie

+0

請檢查CTE內部的第二個查詢。 –

0
SELECT ID,SUBSTRING(COlumnA,1,30) AS ColumnA, 
CASE WHEN LEN(COlumnA)>30 
THEN ColumnB + SUBSTRING(COlumnA,31,LEN(COlumnA)) END AS ColumnB 
FROM TABLE1 
+0

儘管這段代碼片段是受歡迎的,並且可以提供一些幫助,但它會[如果包含解釋](// meta.stackexchange.com/q/114762)如何*和*爲什麼*這解決了這個問題。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

0

您可以使用SUBSTRINGCHARINDEX

SELECT 
    ID, 
    CASE WHEN CHARINDEX(' ', ColumnA, 30) = 0 THEN ColumnA 
    ELSE SUBSTRING(ColumnA, 0, CHARINDEX(' ', ColumnA, 30)) END ColumnA, 
    CASE WHEN CHARINDEX(' ', ColumnA, 30) = 0 THEN ColumnB 
    ELSE SUBSTRING(ColumnA, CHARINDEX(' ', ColumnA, 30), LEN(ColumnA)) + ColumnB END AS ColumnB 
FROM 
    TBL 
0

使用CASE表達和字符串函數LEFTRIGHTSUBSTRING的組合。

查詢

SELECT id, 
     CASE WHEN Len(ColumnA) > 30 THEN LEFT(ColumnA, 30) 
       + Substring(ColumnA, 31, Charindex(' ', 
       RIGHT(ColumnA, Len(columna) - 30)) - 1) 
     ELSE ColumnA END AS ColumnA, 
     CASE WHEN Len(ColumnA) > 30 THEN RIGHT(ColumnA, Len(ColumnA) - 30 
        - Charindex(' ', RIGHT(ColumnA, Len(AolumnA) - 31)) - 1) 
        + ' ' + ColumnB 
     ELSE ColumnB 
     END AS ColumnB 
FROM [your_table_name]; 
相關問題