2016-04-11 20 views
0

は、私のような5つの列を持つテーブルがある値(ないX)の各列のように:もっと効率的な方法は

id value1 value2 value3 final 
1 X  X  X  0 
2 X  Y  Z  2 
3 Y  Z  Z  3 
4 X  Z  X  1 

私はそれをやっている方法は次のとおりです。

Update table 
set final = 3 
where value1 <> 'X' and value2 <> 'X' and value3 <> 'X' 

Update table 
set final = 2 
where (value1 <> 'X' and value2 <> 'X' and value3 = 'X') 
    OR (value1 = 'X' and value2 <> 'X' and value3 <> 'X') 
    OR (value1 <> 'X' and value2 = 'X' and value3 <> 'X') 

Update table 
set final = 1 
where (value1 <> 'X' and value2 = 'X' and value3 = 'X') 
    OR (value1 = 'X' and value2 <> 'X' and value3 = 'X') 
    OR (value1 = 'X' and value2 = 'X' and value3 <> 'X') 

Update table 
set final = 0 
where value1 = 'X' and value2 = 'X' and value3 = 'X' 

私は私をお願いしたいと思いますfこれよりももっとスマートで効率的な方法がありますか?アドバイスをいただければ幸いです。ありがとう!

+0

使用CASE WHEN ... – Squirrel

答えて

0

使用例ケース。 。 。

Update table 
set final = CASE WHEN value1<>'X' and value2<>'X' and value3<>'X' THEN 3 
        WHEN (value1<>'X' and value2<>'X' and value3='X') 
        OR (value1='X' and value2<>'X' and value3<>'X') 
        OR (value1<>'X' and value2='X' and value3<>'X') THEN 2 
        WHEN (value1<>'X' and value2='X' and value3='X') 
        OR (value1='X' and value2<>'X' and value3='X') 
        OR (value1='X' and value2='X' and value3<>'X') THEN 1 
        WHEN value1='X' and value2='X' and value3='X' THEN 0 
        END 
2

これは何ですか?

Update table 
    set final = ((case when value1 <> 'X' then 1 else 0 end) + 
        (case when value2 <> 'X' then 1 else 0 end) + 
        (case when value3 <> 'X' then 1 else 0 end) 
       ); 

これは、Xではない値の数を数えます。

Update table 
     set final = len(replace(value1 + value2 + value3, 'X', ''); 

注:列は実際には一つの文字を持っている値を持っている場合にのみ機能します。ここ

は別の方法です。

0

計算列を使用します。希望の出力が得られない場合は修正してください。

CREATE TABLE GRADES (
id INT 
,VALUE1 VARCHAR(10) 
,VALUE2 VARCHAR(10) 
,VALUE3 VARCHAR(10) 
,final INT AS (
    (
     CASE 
      WHEN value1 <> 'X' 
       THEN 1 
      ELSE 0 
      END 
     ) + (
     CASE 
      WHEN value2 <> 'X' 
       THEN 1 
      ELSE 0 
      END 
     ) + (
     CASE 
      WHEN value3 <> 'X' 
       THEN 1 
      ELSE 0 
      END 
     ) 
    ) 
); 
0
create TRIGGER test 
    ON [dbo].[YourTable] 
    AFTER INSERT 
AS 
BEGIN 
    declare @Id  int 
    declare @value1  nvarchar(10) 
    declare @value2  nvarchar(10) 
    declare @value3  nvarchar(10) 
    declare @Count int =0 

    select top(1) @Id=id, @value1=[m1] ,@value2=[m2],@value3=[m3] from [dbo].[Table_3] order by id DESC 
    if @value1='x' 
    begin 
    set @[email protected]+1 
    end 
    if @value2='x' 
    begin 
    set @[email protected]+1 
    end 
    if @value3='x' 
    begin 
    set @[email protected]+1 
    end 
    update [dbo].[Table_3] 
    set [email protected] 
    where id [email protected] 
END