+------------------+
| 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匹配。答案 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>'