2016-04-11 22 views
0

ben gibi 5 sütunlu bir tablo var değerler gibi her sütun için (değil X):daha etkili yolu

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 

yapıyorum yoludur:

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' 

ben i sormak istiyorum f bundan daha akıllı/daha verimli bir yol var mı? Herhangi bir tavsiye takdir edilecektir. Teşekkürler!

+0

kullanım DURUM NE ZAMAN ... – Squirrel

cevap

0

CASE WHEN. . .

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

İstediğiniz bu mu?

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) 
       ); 

Bu X olmayan değerlerin sayısını sayar.

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

Not: sütunlar gerçekten sadece tek bir karaktere sahip değerlerine sahip yoksa bu sadece çalışır İşte

diğer bir yöntemdir.

0

Hesaplanan sütunu kullanma. İstenilen çıktı alınmazsa düzeltin.

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 
İlgili konular