在SQL中,是否可以在insert语句中使用虚拟列?

时间:2014-01-20 20:39:05

标签: sql sql-server-2008

所以我有一些插入:

insert into table (col1, col2, dummy, col3) values (1,1,1,1), (2,2,2,2)

“虚拟”列实际上并不存在,它是必需的,因为我生成了insert语句,甚至是列标题,并且根据情况需要忽略一些列,但是数据仍然是相同的,它会使如果我不需要弄乱数据和标题,我的生活会轻松得多。

所以我想用另一种方式说:是否可以“忽略”插入语句中的列。


换句话说,我试图在3列上插入一个包含4列数据的插入语句,并想知道是否有任何方法可以在SQL级别而不是代码处理这个问题。逻辑层面。


所以这是一个较长的例子,我有这个2D数组。

{ {101,102,103,104}, {201,202,203,204}, ... }

我有一个包含以下列的表

col1, col2, col3, col4

现在有一位用户说:

"I would like to only use col1, col2, col4"

另一位用户说:

"I would like to only use col2, col3"

如果我不想弄乱2D数据阵列,我该怎么做?

insert into table (col1, col2, ignore, col4) 
    values (101,102,103,104), (201,202,203,204)


insert into table (ignore, col2, col3, ignore) 
    values (101,102,103,104), (201,202,203,204)

请注意,订单很重要。

2 个答案:

答案 0 :(得分:7)

这听起来像是一个疯狂的疯狂要求,但有一种方法可以让它发挥作用。

使用包含3列t的表(a,b,c),您可以使用SQL-Server 2008及更高版本中提供的表值构造函数。请注意如何通过仅更改一行SQL代码来更改将输入的哪些列插入到表中:

INSERT INTO t 
  (a, b, c) 
SELECT 
  col1, col3, col4            -- this is the only line needs configured
                              -- col2 is ignored
FROM 
  ( VALUES
    ( 1, 2, 3, 4), 
    (11,12,13,14),
    (21,22,23,24),
    (31,21,33,34)
   ) AS x 
     (col1, col2, col3, col4)
;

SQL-Fiddle

进行测试

如果表格有4列(a,b,c,d) - 与值列表一样多 - 类似的方法是:

INSERT INTO t 
  (a, b, c, d) 
SELECT 
  col1, NULL, col3, col4         -- this is the only line needs configured
                                 -- col2 is ignored and NULLs are put
                                 -- into column "b"
FROM         --- rest of the code is the same

答案 1 :(得分:4)

  

是否可以“忽略”插入语句中的列。

是的,请勿将其包含在字段列表中。例如:

insert into table (col1, col2, col3)

只会将值插入col1col2col3,并将其余列(在新行中)保留为默认值。