合并列并删除空白
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
这就是你想要的吗?
我有一个 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
这就是你想要的吗?