Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联管柱并移除空白_Sql_Sql Server_Syntax - Fatal编程技术网

Sql 联管柱并移除空白

Sql 联管柱并移除空白,sql,sql-server,syntax,Sql,Sql Server,Syntax,我有一张这样的表格(我把它缩短了) 所以no、no19和no68是3个不同的列,但是列'no'中的数据在列'no'中的数据结束后的下一行开始 在这些列之间,我有更多的数据,我想创建一个可读的表。我使用以下代码将这些列合并为一列: CREATE TABLE MULTICURRENCY_CHECK ( TOKEN varchar(255) ) INSERT INTO MULTICURRENCY_CHECK ( TOKEN ) SELECT no

我有一张这样的表格(我把它缩短了)

所以no、no19和no68是3个不同的列,但是列'no'中的数据在列'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 | a | b | c | d
select
isnull(no,'')+isnull(no19,'')+isnull(no68,''),
a,b,c,d
from book1
因此,列内标记之间有空行。我尝试过删除它们,但它是通过简单的delete命令实现的,但不起作用(尝试了下面的两种方法):

也许我应该用另一种方式来处理这张桌子,也许更快?正如原始表所示(仅示例数据)

因此,我希望最后的表格是这样的:

TOKEN
3387034694344500        
3387452540705400        
3388486878919450


3371522572594880
3372232397709690    
3373608476884750


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

其中,token是no、no19和no68的合并,然后从token列(a、b、c、d可以为空)中找到数据匹配适当id的a、b、c、d列。

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

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,因为一列只包含另一列为null时的数据:

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;

至于为什么你的删除不起作用,也许那些空的不是空的。也许它们包含一个制表符或50个空格?在这种情况下,@sidux对你的Q的评论就可以了。修剪字段并查看其值在哪里

可能是这样的:

TOKEN
3387034694344500        
3387452540705400        
3388486878919450


3371522572594880
3372232397709690    
3373608476884750


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

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

我创建了一个包含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

这就是你想要的吗?

我不明白问题的第二部分。但是,您可以通过以下查询删除“空”记录:从多货币_检查中删除,其中COALESCE(RTRIM(LTRIM(TOKEN)),“”)=“”;对于给定的数据,您能用预期的转换填充结果表吗?好的,它正在使用COALESCE(不太了解transact-sql)。我想我会处理剩下的,现在只是连接表的问题。酷,这比UNION AllInterest快得多,我使用了以下代码:选择COALESCE(no,no,no 19,no 68,no 93,no 107)作为“令牌”,COALESCE(localdate,LocalDate13,LocalDate62,LocalDate87,LocalDate101)作为Book1中的'Date',但它没有显示所有结果,因为一些令牌编号混乱并且有文本字符串,所以更好的使用是@marcin wojdak建议的这段代码,选择isnull(no',)+isnull(no19',)+isnull(no68',)+isnull(no93',)+isnull(no107',作为'Token',isnull(localdate',)+isnull(LocalDate13',)+isnull(LocalDate62',)+isnull(LocalDate87',)+isnull(LocalDate101',)作为'Date',来自Book1,这很有趣。我怀疑发生的情况是,'+'运算符正在强制执行
强制转换(字段为NumberFormat)
这样它就可以做这件事了。所以“+”虽然从CPU的角度来看可能比较慢,但它同时做着
CAST
coalise
两项工作。如果你的数据不大,那么这是一个可靠的解决方案。目前它不大,因为我只处理样本,但目的是将它应用于一个非常大的数据库。你认为呢那么你建议呢?我认为你将遇到的最大性能问题来自于你表中的脏数据。看起来你的记录看起来是空的,但实际上里面有空白(制表符和空格)。这使得
COALESCE()
毫无用处,因此你不得不依赖于更简陋的解决方案,比如
isnull()+isnull()…
合并(修剪(字段)、修剪(字段2),…)
当您的数据增长时,这两种方法都会很昂贵。如果性能有问题,请清理数据。清理数据不是一个选项,因为数据是从外部发送并加载到数据库的。实际上,我需要的只是处理每日、每周和每月的数据。您认为如果我创建视图会更快吗在适当的时间段内运行t,然后运行我的查询?