我有一个看起来像这样的表(我为了示例目的缩短了它)
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)
答案 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
这就是你要追求的吗?