合并列并删除空白

Union columns and remove blanks

我有一个 table 看起来像这样(出于示例目的我已经缩短了它)

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

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

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

 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

也许我应该用不同的方法来处理这个 table,也许更快?由于原始 table 看起来像这些(只是样本数据)

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

所以我最后想要的是 table 这样的:

 | TOKEN | a | b | c | d

其中令牌是 no、no19 和 no68 的合并,然后是 a、b、c、d 列,其数据与 TOKEN 列中的适当 ID 相匹配(a、b、c、d 可以为空)

您可以在 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() 而不是联合,因为一个列仅在其他列为空时才包含数据:

SELECT COALESCE(no, no19, no68) FROM table

不是将这些值放在它们自己的 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 的评论就可以解决问题。修剪字段并查看其值所在的位置 =''

也许是这样的:

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

这应该连接一行中的所有标记(并且只有来自 no、no19 和 no68 的标记才有值)。

我创建了一个包含 3 个文本列的 table '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

这就是你想要的吗?