将子字符串的某些部分根据宽度从一列移动到另一列

时间:2017-03-03 10:19:25

标签: sql sql-server

我们有这些列可以说

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

我想要一个查询,如果columnA的LEN大于30,则在最后一个空格后将columnA的其余部分移至columnB

所以..我们最终会以

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

对不起,伙计们,我可能还不够清楚。也许这可能会有所帮助:

更新TableA set ColumnA = ColumnA - (最后一个空格后的最后一个子字符串的值), ColumnB =(最后一个空格后ColumnA的最后一个子字符串的值)+','+ ColumnB 其中LEN(ColumnA)> 30

注意IDB上的12如何在ColumnB上添加值和空格+ columnB。

4 个答案:

答案 0 :(得分:1)

尝试以下查询,这将为您提供ColumnA中的前30个字母,尾随将附加到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 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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];