如何组合同一列的SQL查询?

时间:2014-05-13 14:55:27

标签: sql sql-server

我搜索过但没有找到任何关于我特定问题的例子。

我试图从包含部门名称的列中删除一些不需要的文本。我试图结合2个查询来做到这一点。

第一个查询删除名称中冒号后面的所有字符:

SELECT
CASE WHEN CHARINDEX(':', DB.Table.DEPT)>0 
THEN
LEFT(DB.Table.DEPT, CHARINDEX(':', DB.Table.DEPT)-1) 
ELSE 
DB.Table.DEPT
END
FROM
DB.Table

第二个查询从名称中删除前缀:

SELECT
REPLACE(
REPLACE(
REPLACE (DB.Table.DEPT,'[NA1] ','') 
,'[NA2] ', '')
,'[NA3] ', '')
FROM
DB.Table

这两种方法都很好地相互独立,但当我尝试将它们组合起来时就失败了。

SELECT
CASE WHEN CHARINDEX(':', DB.Table.DEPT)>0 
THEN
LEFT(DB.Table.DEPT, CHARINDEX(':', DB.Table.DEPT)-1) 
ELSE 
DB.Table.DEPT
END
FROM
(SELECT
REPLACE(
REPLACE(
REPLACE (DB.Table.DEPT,'[NA1] ','') 
,'[NA2] ', '')
,'[NA3] ', '')
FROM
DB.Table)

我真的可以用这个指导。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的查询在语法上是不正确的,因为您需要子查询的别名和表达式结果:

SELECT (CASE WHEN CHARINDEX(':', DEPT)>0 
             THEN LEFT(DEPT, CHARINDEX(':', DEPT)-1) 
             ELSE DEPT
        END)
FROM (SELECT REPLACE(REPLACE(REPLACE(t.DEPT,'[NA1] ',''
                                    ), '[NA2] ', ''
                            ), '[NA3] ', ''
                    ) as DEPT
      FROM DB.Table t
     ) t;

编辑:

要查看原始部门和新部门:

SELECT (CASE WHEN CHARINDEX(':', new_DEPT) > 0 
             THEN LEFT(new_DEPT, CHARINDEX(':', newj_DEPT)-1) 
             ELSE new_DEPT
        END),
        Orig_DEPT
FROM (SELECT REPLACE(REPLACE(REPLACE(t.DEPT,'[NA1] ',''
                                    ), '[NA2] ', ''
                            ), '[NA3] ', ''
                    ) as new_DEPT,
             t.DEPT as orig_DEPT
      FROM DB.Table t
     ) t

答案 1 :(得分:0)

你应该总是命名你的subquerys。

试试这个:

SELECT
    CASE WHEN CHARINDEX(':', x.DEPT)>0 
    THEN
        LEFT(x.DEPT, CHARINDEX(':', x.DEPT)-1) 
    ELSE 
        x.DEPT
    END AS DEPT
FROM
(
    SELECT
        REPLACE(REPLACE(REPLACE (DEPT,'[NA1] ','') ,'[NA2] ', ''),'[NA3] ', '') AS DEPT
    FROM
    DB.Table
) x