2016-01-27 90 views
1

我試圖檢查數據是否存在於ID但不是其對應的值,然後整個行從輸出中丟棄。如果這兩個值和id是空白,則它的確定,以及那些行中的輸出當id不爲空或空白時檢查丟失的數據

DECLARE @TAB TABLE 
(
ID VARCHAR (50), 
SKU VARCHAR (50), 
Resistor_ID1 VARCHAR (50), 
Resistor_Value VARCHAR (50), 
Capacitor_ID VARCHAR (50), 
Capacitor_Value VARCHAR (50), 
Inductor_ID VARCHAR (50), 
Inductor_Value VARCHAR (50) 
) 

INSERT @TAB 

SELECT '1', 'BPN1256', '1033', ''  , 'RMA56', 'Ceramic', 'PVAN59', 'Ferrite' UNION ALL 
SELECT '1', 'SAN9286', '' , ''  , 'TMA56', 'FILM' , ''  , ''  UNION ALL 
SELECT '1', 'RJA1896', '3033', '35OHM', 'UMA56', 'Ceramic', 'PVAN59', 'Ferrite' UNION ALL 
SELECT '1', 'DNN5256', '4033', '45OHM', 'QMA56', ''  , 'PVAN59', 'Ferrite' UNION ALL 
SELECT '1', 'LXA6556', '5033', '65OHM', 'ZMA56', 'FILM' , 'PVAN59', '' 

預計產量保持

 
1 SAN9286    TMA56 FILM 
1 RJA1896 3033 35OHM UMA56 Ceramic PVAN59 Ferrite 

請分享您的經驗。 謝謝

+2

從不使用空字符串作爲NULL ... – jarlh

+1

您正在使用哪個數據庫系統? – MortenSickel

+1

調整你的例子,你需要那麼多列嗎?更好地描述爲什麼只有那些箭頭被返回。 – jarlh

回答

1

那麼,爲什麼不直接做呢?當ID和值都爲空時,或者ID和值都不爲空時,您都需要行。把它放到where子句中,重複3個id-值對,就完成了。

SELECT * FROM @TAB 
WHERE (Resistor_ID1 != '' and Resistor_Value != '' or Resistor_ID1 = '' and Resistor_Value = '') 
and (Capacitor_ID != '' and Capacitor_Value != '' or Capacitor_ID = '' and Capacitor_Value = '') 
and (Inductor_ID != '' and Inductor_Value != '' or Inductor_ID = '' and Inductor_Value = '') 

重要注意事項:您沒有指定您的DBMS,因此您可能需要更改該查詢語法。例如,在Oracle中,一個空字符串('')被視爲null值,應該使用value is null而不是value = ''進行檢查。在Mysql中,null和空字符串是不同的東西,應該以不同的方式進行檢查。

UPD:它應該工作正常使用=!=用於MS SQL Server中,如果實際插入空字符串,而不是空值。如果你不知道,你可能想看看How do I check if a Sql server string is null or empty

+0

@jarlh:id值是標識列,對不起,錯字錯誤 –

+0

謝謝Timekiller .................... –

2
DECLARE @TAB TABLE 
    (
    ID VARCHAR (50), 
    SKU VARCHAR (50), 
    Resistor_ID1 VARCHAR (50), 
    Resistor_Value VARCHAR (50), 
    Capacitor_ID VARCHAR (50), 
    Capacitor_Value VARCHAR (50), 
    Inductor_ID VARCHAR (50), 
    Inductor_Value VARCHAR (50) 
    ) 

    INSERT @TAB 

    SELECT '1', 'BPN1256', '1033', '','RMA56', 'Ceramic', 'PVAN59', 'Ferrite' UNION ALL 
    SELECT '1', 'SAN9286', '', '', 'TMA56', 'FILM',  '',   '' UNION ALL 
    SELECT '1', 'RJA1896', '3033', '35OHM', 'UMA56', 'Ceramic', 'PVAN59', 'Ferrite' UNION ALL 
    SELECT '1', 'DNN5256', '4033', '45OHM', 'QMA56', '',   'PVAN59', 'Ferrite' UNION ALL 
    SELECT '1', 'LXA6556', '5033', '65OHM', 'ZMA56', 'FILM', 'PVAN59', '' 

    SELECT * FROM @TAB t WHERE ((t.Resistor_ID1<>'' AND t.Resistor_Value<>'') OR (t.Resistor_ID1='' AND t.Resistor_Value='')) 
    AND ((t.Capacitor_ID<>'' AND t.Capacitor_Value<>'') OR (t.Capacitor_ID='' AND t.Capacitor_Value='')) 
    AND ((t.Inductor_ID<>'' AND t.Inductor_Value<>'') OR (t.Inductor_ID='' AND t.Inductor_Value='')) 

但是,你應該採取使用空字符串或空照顧。有顯着差異。在你的例子中,你使用了空字符串來顯示缺少數據,上面的選擇適用於空字符串。