获取2列的值作为单个值,以“|”

时间:2017-07-07 15:28:51

标签: sql

DECLARE @mockup TABLE(Column1 VARCHAR(1),Column2 VARCHAR(1));
INSERT INTO @mockup VALUES('1','2'),('-','2'),('1','2'),('-','-'),('2','-'),('1','2');

SELECT ISNULL(NULLIF(Column1 + '|','-|'),'')
      +ISNULL(NULLIF(Column2,'-'),'')
FROM @mockup

以上查询结果如下,

1|2
2
1|2
2|
1|2

我想要的结果如上所述除了row4,其中2 |应该只是2。 '|'不应该在值之前或之后存在。

3 个答案:

答案 0 :(得分:0)

使用Replace功能

SELECT replace(replace(replace(Column1 + '|' + Column2,'-|',''),'|-',''),'-','')
FROM @mockup

或尝试使用CASE声明

SELECT CASE 
         WHEN column1 LIKE '[0-9]' AND column2 LIKE '[0-9]' THEN column1 + '|' + column1 
         WHEN column1 LIKE '[0-9]' AND column2 NOT LIKE '[0-9]' THEN column1 
         ELSE column2 
       END 
FROM   @mockup 

如果您想检查-而不是数字,那么

SELECT CASE 
         WHEN column1 NOT LIKE '-'  AND column2 NOT LIKE '-' THEN column1 + '|' + column1 
         WHEN column1 NOT LIKE '-'  AND column2 LIKE '-' THEN column1 
         ELSE column2 
       END 
FROM   @mockup 

答案 1 :(得分:0)

只需加入这两个字段,然后使用REPLACE删除|--|WHERE子句中的条件可以避免两个字段都为-的记录:

select replace(replace(Column1+'|'+Column2,'-|',''),'|-','') as Result
from mockup
where coalesce(nullif(Column1,'-'),nullif(Column2,'-')) is not null

输出:

Result
1|2
2
1|2
2
1|2

查看结果here

答案 2 :(得分:0)

我会这样做:

select stuff( ((case when column1 not like '-' then '|' + column1 else '' end) +
               (case when column2 not like '-' then '|' + column2 else '' end)
              ), 1, 1, '');

这是我发现在SQL Server中实现concat_ws()的最简单方法。 concat_ws()是其他数据库中可用的功能,您可以这样做:

select concat_ws('|',
                 (case when column1 not like '-' then column1 end),
                 (case when column2 not like '-' then column2 end)                 
                )