联盟列和删除空格

时间:2015-03-23 14:16:46

标签: sql sql-server syntax

我有一个看起来像这样的表(我为了示例目的缩短了它)

no               no19             no68
3387034694344500        
3387452540705400        
3388486878919450                
                 3371522572594880   
                 3372232397709690   
                 3373608476884750   
                                  3382142940562320
                                  3382142940562320
                                  3383084144363070

所以不,no19和no68是3个不同的列,但是“no19”列中的数据在“no”列中的数据结束后的下一行开始。

在这些列之间我有更多的数据,我想创建一个可读的表。我已使用以下代码将这些列合并为一个:

 CREATE TABLE MULTICURRENCY_CHECK
(
TOKEN varchar(255)
)                           
INSERT INTO MULTICURRENCY_CHECK
(
TOKEN
)
SELECT no FROM book1
    UNION ALL
SELECT no19 FROM book1
    UNION ALL
SELECT no68 FROM book1

问题是,我得到的结果如下:

TOKEN
3387034694344500        
3387452540705400        
3388486878919450


3371522572594880
3372232397709690    
3373608476884750


3382142940562320
3382142940562320
3383084144363070

因此列TOKEN之间有空行。我试图删除它们,但它通过简单的删除命令,但它不起作用(尝试过以下两个):

delete from multicurrency_check where TOKEN = ' '
delete from multicurrency_check where TOKEN is NULL

也许我应该采用不同的方式来处理这张桌子,也许更快?由于原始表看起来像这些(只是样本数据)

no                   a      b      no19             c    d      no68
    3387034694344500 data1  data4   
    3387452540705400 data2  data5   
    3388486878919450 data3  data6           
                                  3371522572594880 data7 data10
                                  3372232397709690 data8 data11
                                  3373608476884750 data9 data12
                                                                3382142940562320
                                                                3382142940562320
                                                                3383084144363070

所以我最终想要的是这样的表格:

 | TOKEN | a | b | c | d

其中token是no,no19和no68的合并,然后是a,b,c,d列,其中数据匹配来自TOKEN列的相应id(a,b,c,d可以为null)

3 个答案:

答案 0 :(得分:1)

您可以在UNION查询中删除它们,如:

SELECT no FROM table WHERE no IS NOT NULL
UNION
SELECT no19 FROM table WHERE no19 IS NOT NULL
UNION 
SELECT no68 FROM table where no68 IS NOT NULL

您也可以使用COALESCE()而不是union,因为当其他列为空时,列只包含数据:

SELECT COALESCE(no, no19, no68) FROM table

您可以从上面的查询开始并构建它们,而不是将这些值放在自己的表中。假设您还要将A,B或C,D引入结果:

SELECT COALESCE(no, no19, no68) as newno, COALESCE(a,c) as ac, COALESCE(b,d) as bd FROM table;

至于你的DELETE为什么不起作用,也许这些NULL不是NULL。也许他们持有TAB角色或50个空格?在这种情况下,@ sidux对你的Q的评论就可以了。修剪字段并查看其值为=''的位置。

答案 1 :(得分:0)

也许是这样的:

select
isnull(no,'')+isnull(no19,'')+isnull(no68,''),
a,b,c,d
from book1

那应该连接所有令牌(并且只有一个来自no,no19和no68将有一个值)。

答案 2 :(得分:0)

我创建了一个包含3个文本列的表'foo',如下所示:

       column1            column2            column3
       -------            -------            -------
row1   3371522572594880                      3373608476884750
row2   asdfasdf                              asdfasdf
row3                      3387452540705400   3388486878919450

然后执行查询

select token from(
select column1 as token from foo where column1 != '' 
union all 
select column2 as token from foo where column2 != ''
union all
select column3 as token from foo where column3 != ''
)

得到了结果:

token
3371522572594880
asdfasdf
3387452540705400
3388486878919450
3373608476884750
asdfasdf

这就是你要追求的吗?