如果等于单个值,则设置整个字段行值

时间:2014-05-16 15:44:33

标签: sql-server tsql

对于令人困惑的标题感到抱歉,但我找不到更好的解释方法。

我有一些结果,如果找到特定的代码,一行应填充整行。

以下是数据:

PartID   CustomerID  Status    Qty   Notes
1000     900123      1         10    NULL
911      900123      1         5     NULL

这就是我想要它做的事情:

PartID   CustomerID  Status    Qty   Notes
1000     900123      1         10    911
911      900123      1         5     911

如果一个PartID的值为911,我怎么能写一个查询来给notes字段赋值911?

编辑:感谢大家的回复,但我希望我可以使用Select语句来实现这一目标。我通过使用临时表来完成此操作,如果客户的订单中有911,则更新,仅使用911更新客户的注释,然后查询临时表以获取数据。

6 个答案:

答案 0 :(得分:0)

试试这个:

UPDATE Table 
SET Notes=(CASE WHEN (SELECT Count(1) FROM Table Where PartId=911)>0 THEN 911 ELSE NULL END)

UPDATE t
SET t.Notes= t2.PartId
FROM Table t
LEFT JOIN Table t2 on t2.PartId=911

答案 1 :(得分:0)

update #t
set Notes=(select PartID from #t where PartID in(911))

select * from #t

SEE DEMO

答案 2 :(得分:0)

您可以使用类似

的内容
update MyTable
set Notes = '911'
where (select count(1) from @MyTableVar where PartID = 911) > 0

例如:

DECLARE @MyTableVar table( PartID int,
                           CustomerID int,
                           Status int,
                           Qty int,
                           Notes varchar(50));

insert into @MyTableVar(PartID, CustomerID, Status, Qty, Notes)
values (1000, 900123, 1, 10, null)

insert into @MyTableVar(PartID, CustomerID, Status, Qty, Notes)
values (911, 900123, 1, 5, null)

select * from @MyTableVar

update @MyTableVar 
set Notes = '911'
where (select count(1) from @MyTableVar where PartID = 911) > 0

select * from @MyTableVar

编辑: 要更改返回的值,而不是更新数据库,您可以执行以下操作(基于上面的示例):

select 
  mtv.PartID, 
  mtv.CustomerID, 
  mtv.Status, 
  mtv.Qty, 
  case when (select count(1) from @MyTableVar where PartID = 911) > 0 
    then '911' 
    else mtv.Notes 
  end as Notes 
from 
  @MyTableVar mtv

答案 3 :(得分:0)

select PartID, CustomerID, Status, Qty, 
case when exists(select * from notes where PartID = 911) then '911' else Notes end Notes
from notes 

答案 4 :(得分:0)

我建议你将逻辑分成两个单独的动作:

--1. check condition
declare @IsPartIDDetected int = 0;
if exists (select PartID from Notes where PartID = 911 )
  set @IsPartIDDetected = 1;

--2. get filteredoutput
select PartID, CustomerID, Status, Qty,
  case when @IsPartIDDetected = 1 then '911' else COALESCE(Notes,'') end as Notes
from Orders

此解决方案具有最佳执行计划,并且内存成本更低。 添加了COALESCE命令作为处理的NULL值的示例。

您也可以将其包装成单个CTE语句:

WITH partCondition as ( 
    select top 1 PartID as conditon from Notes where PartID = 911
)
    select PartID, CustomerID, Status, Qty, 
      case 
        when exists ( select * from partCondition ) 
          then 911        --conditon met
          else Notes end  --condition NOT met
        as Notes
    from Orders;

这有助于降低执行成本。

答案 5 :(得分:0)

不清楚一个部分ID是什么意思 你的意思是CustomerID的partID是911吗?

运行这两个陈述:

update customer 
   set notes  = 911
 where partID = 911 
   and notes <> 911;

update c2 
   set c2.notes = 911
  from customer c1 
  join customer c2 
    on c2.CustomerID = c1.CustomerID
   and c1.partID = 911 
   and c2.partID <> 911
   and (c2.notes <> 911 or c2.notes is null);

这一个声明可能会这样做,但不确定它会更快:

update c2 
   set c2.notes = 911
  from customer c1 
  join customer c2 
    on c2.CustomerID = c1.CustomerID
   and c1.partID = 911 
   and (c2.notes <> 911 or c2.notes is null);