SQL更新数据集中的位置

时间:2012-07-24 06:58:17

标签: sql arrays sql-server-2008 where

+------------------+
| id1 | id2 | bool |
+------------------+
|  1  |  1  |  F   |
|  1  |  2  |  F   |
|  2  |  1  |  F   |
+------------------+

UPDATE table_name
SET bool = T
WHERE (id1, id2) IN ((1,1),(2,1)) --Need work here

所以基本上我想选择(id1,id2)=(value1,value2)的条件。 与下面的陈述类似:

WHERE id1 = value1 AND id2 = value2

但是在数组中的值集合中。 这可能吗?

提前致谢

编辑:我正在使用SQL Server 2008.如果不太清楚,我很抱歉。 我正在尝试将其作为存储过程并从服务中调用它。输入将是某种数组(可变大小),并找到与行中的两个ID匹配。

7 个答案:

答案 0 :(得分:2)

以下是在MSSql中执行此操作的方法。您只需要从Id1和Id2创建一个值(在此示例中为VARCHAR)。在这种情况下,您可以使用IN语句设置值。如果在这些字段中允许它们,你应该考虑id1和id2中的NULL(只需添加:and id1 is not null and id2 is not null)。

UPDATE table_name
SET bool = T
WHERE convert(varchar(20),id1)+','+convert(varchar(20),id2) in ('1,1','2,1')

答案 1 :(得分:0)

如果您使用的是SQL Server,请尝试使用

     UPDATE table_name
     SET bool = T
     WHERE (convert(varchar 20, id1) + '-' + convert(varchar 20 , id2)) 
      IN (convert(varchar 20 , value1) + '-' + convert(varchar 20 , value2),
        convert(varchar 20 , value3) + '-' + convert(varchar 20 , value4));

如果您使用的是

,请尝试此操作
     UPDATE table_name
     SET bool = T
       WHERE (id1 || '-' || id2) IN (value1 || '-' || value2)

通常我们使用in子句,如果我们有更多的匹配值。 假设你(id1 = value1和id2 = value2)和(id1 = value3和id2 = value4)

     UPDATE table_name
     SET bool = T
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4)

答案 2 :(得分:0)

实现这一目标的一个想法是使用临时表

Create Table #Temp
(
  id1 int,
  id2 int
)
insert into #Temp values(1,1)
insert into #Temp values(1,2)
insert into #Temp values(2,1)
insert into #Temp values(2,2)

--update data
UPDATE 
table_name 
SET bool = T 
from table_name T1   
inner join #Temp T2 
on T1.Id1= T2.Id1
and T1.Id2= T2.Id2

答案 3 :(得分:0)

试一试 - SQL Server 2008版。

create table mytable
(
id1 int,
id2 int,
bool char(1)
);

insert INTO mytable VALUES(1,1,'F');
insert INTO mytable VALUES(1,2,'F');
insert INTO mytable VALUES(2,1,'F');

SELECT * FROM mytable;

update mytable 
set bool='T'
WHERE exists (SELECT id1,id2 from mytable tb2
where mytable.id1 = 1 AND mytable.id2 = 1
or mytable.id1 = 2 AND mytable.id2 = 1);

SELECT * from mytable;

答案 4 :(得分:0)

此查询适用于oracle ...

UPDATE table_name 
SET BOOL = T 
WHERE (id1, id2) IN (SELECT 1,1 FROM DUAL UNION SELECT 2,1  FROM DUAL);

您的数据库是哪个?

答案 5 :(得分:0)

你从根本上想做什么?为什么这样你选择这样做?在理解基于集合的逻辑时,您似乎有点模糊。其他海报提供的每个答案都是有效的,并且可以使用,但可能不是最适合您的目的。这是针对现有数据集的处理吗?它是数据加载或插入过程的一部分吗?您列出的每个ID字段都有自己的唯一值范围。根据您的示例,您 想要做的事情似乎是在ID2 = 1时更新bool值

UPDATE table_name SET Bool = 'T'
WHERE Id2 = 1

您更有可能希望开发一种基于某些数据规则设置Bool值的逻辑 - 例如,如果Id2小于或等于Id1。案例陈述在这里起作用:

UPDATE table_name SET Bool = CASE WHEN Id1 > Id2 THEN 'T' ELSE 'F' END

当你处理大量数据时,这比在你插入的值的每个变体中在WHERE子句中写入AND / OR规则要高效得多。

将WHERE视为过滤器而不是实现if / then type logic。

在小数据插入中(您可以手动在表字段中键入值,从事务中按某种类型的Web表单事务插入),最简单的方法是手动设置您认为合适的值,或者将其构建到系统的程序部分,并将验证规则应用于表。

如果要编写执行此操作的存储过程,则需要为ID值创建变量,并将这些变量链接到任何将外部信息传输到数据库系统的系统。 (我假设你已经创建了表格结构);

CREATE PROCEDURE table_name_insert
@Id1 Int NOT NULL,
@Id2 Int NOT NULL

-- If you want to execute the logic outside of the DB environment
-- (perhaps as part of an SSIS package) then you will want to add this
-- variable and pass it in explicitly.

, @Bool bit NOT NULL 


AS

DECLARE @sql nvarchar(4000)


SET @sql = '
INSERT INTO table_name (ID1, ID2, Bool)
SELECT @Id1, @Id2, [Case Logic or Variable Value for Bool]
' EXEC sp_executeSQL @sql

您的程序可以调用此过程,并将可能从数组生成的变量传递给它。还有一些方法可以将值直接导入相应的列,然后在插入后的代码中执行Bool逻辑。 “硬编码”一个处理每个案例的WHERE语句是低效的,也是一个不好习惯。

答案 6 :(得分:0)

您可以将值列表作为XML发送到存储过程。将XML解包为表变量,并使用exists查找应更新的行。

create procedure YourSP
  @XMLParam xml
as

declare @T table(id1 int, id2 int)

insert into @T(id1, id2)
select T.N.value('id1[1]', 'int'),
       T.N.value('id2[1]', 'int')
from @XMLParam.nodes('/Row') as T(N)

update table_name
set bool = 'T'
where exists (select *
              from @T as T
              where T.id1 = table_name.id1 and
                    T.id2 = table_name.id2)

这样打电话:

exec YourSP '<Row>
               <id1>1</id1>
               <id2>1</id2>
             </Row>
             <Row>
               <id1>2</id1>
               <id2>1</id2>
             </Row>'