11
+------------------+
| 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 的匹配项。

4

7 回答 7

3

这是在 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')
于 2012-07-26T11:17:06.550 回答
1

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

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
于 2012-07-24T07:07:53.143 回答
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;
于 2012-07-24T07:12:39.947 回答
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>'
于 2012-07-26T08:58:20.487 回答
0

此查询在 oracle 中有效...

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

你的数据库是哪个?

于 2012-07-24T07:26:51.400 回答
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 类型逻辑的地方。

在小型数据插入中(您可以手动在表字段中键入值,或者从某种 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 语句效率低下,并且是一个坏习惯。

于 2012-07-26T00:30:23.037 回答
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));

如果您使用的是 oracle,请尝试此操作

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

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

     UPDATE table_name
     SET bool = T
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4)
于 2012-07-24T07:07:10.527 回答