我有一张桌子。
从LAST列开始,我需要将空格转换为NULL,直到我达到数据。
例如:
Table1
column1, column2, column3, column4, column5
column1,column2和column3包含数据,column4和column5包含空格。
所以我的进程会将column4和column5从空白变为NULL。
示例2:
Table1
column1, column2, column3, column4, column5
column1,column2,column3和column4有数据,column5有空格。
所以我的进程会将column5从空白变为NULL。
我看到它的方式是有2个循环。一个遍历表格中的每一行,然后从最后一列开始,更新每一列,直到我到达数据。
有没有人有关于如何遍历表格的每一列的任何提示?我知道如何遍历表中的行,但我从未迭代过表中的列。
谢谢
答案 0 :(得分:1)
如果您的数据中没有NULL
,这可能对您有用:
create table t4 (
id int identity(1,1) not null primary key clustered,
v1 varchar(10) null,
v2 varchar(10) null,
v3 varchar(10) null,
v4 varchar(10) null
)
insert t4 (v1, v2, v3, v4)
values ('a', 'b', 'c', 'd'),
('a', 'b', 'c', ''),
('a', 'b', '', ''),
('a', '', '', ''),
('', '', '', '')
update t4
set v4 = case when v4 = '' then null else v4 end,
v3 = case when v3 + v4 = '' then null else v3 end,
v2 = case when v2 + v3 + v4 = '' then null else v2 end,
v1 = case when v1 + v2 + v3 + v4 = '' then null else v1 end
在:
+----+----+----+----+----+
| id | v1 | v2 | v3 | v4 |
+----+----+----+----+----+
| 1 | a | b | c | d |
| 2 | a | b | c | |
| 3 | a | b | | |
| 4 | a | | | |
| 5 | | | | |
+----+----+----+----+----+
后:
+----+------+------+------+------+
| id | v1 | v2 | v3 | v4 |
+----+------+------+------+------+
| 1 | a | b | c | d |
| 2 | a | b | c | NULL |
| 3 | a | b | NULL | NULL |
| 4 | a | NULL | NULL | NULL |
| 5 | NULL | NULL | NULL | NULL |
+----+------+------+------+------+
答案 1 :(得分:0)
使用循环是完全错误的方法。当你想到循环时你应该停下来并重新思考,因为循环,尤其是嵌套循环,几乎总是错误的方法。
相反怎么样?它将整个表设置在一个语句中。
Update Table1
set column1 = nullif(column1, '')
, column2 = nullif(column2, '')
, column3 = nullif(column3, '')
, column4 = nullif(column4, '')
, column5 = nullif(column5, '')
- 编辑 -
根据我的新理解,也许你需要这样的东西。但这是一个非常重要的信号,表明这里出了点问题。表中列的顺序应该没有意义。这似乎是你在这里重复违反1NF的团体。但如果没有真正的细节,就不可能肯定地说。
Update Table1
set column1 = nullif(column1, '')
, column2 = nullif(column1 + column2, '')
, column3 = nullif(column1 + column2 + column3, '')
, column4 = nullif(column1 + column2 + column3 + column4, '')
, column5 = nullif(column1 + column2 + column3 + column4 + column5, '')
答案 2 :(得分:0)
从我的理解来看,你正在倒退。列更新的唯一原因是它和它之后的所有列都是空白的......
假设我正在您的示例表上起草更新声明,我认为它会像这样:
UPDATE table1
SET column5 = CASE WHEN column5 = '' THEN NULL ELSE column5 END
,column4 = CASE WHEN column5 = '' AND column4 = '' THEN NULL ELSE column4 END
,column3 = CASE WHEN column5 = '' AND column4 = '' AND column3 = '' THEN NULL ELSE column3 END
......等等 - 第4列变为空的唯一方法是4& 5都是空白的。
如果你正在使用sys.tables& sys.columns你可以得到column_id并向后工作......可能。我想到的最终结果将是一个动态的SQL语句,然后执行。
这是一个有趣的问题,而不是我以前见过的问题 - 用例是什么?
答案 3 :(得分:0)
如果我理解这一点,似乎要更新哪些列取决于某些条件,哪一列是空白的。
例如,如果数据仅存在于column1中,则更新column2,3,4,5,而在第2列中为空。
我只能认为更新会是这样的:
UPDATE TABLE1
SET COLUMN2 = NULL,
COLUMN3 = NULL,
COLUMN4 = NULL,
COLUMN5 = NULL
WHERE COLUMN2 = ''
UPDATE TABLE1
SET COLUMN3 = NULL,
COLUMN4 = NULL,
COLUMN5 = NULL
WHERE COLUMN3 = ''
UPDATE TABLE1
SET COLUMN4 = NULL,
COLUMN5 = NULL,
WHERE COLUMN4 = ''
UPDATE TABLE1
SET COLUMN5 = NULL
WHERE COLUMN5 = ''