当id不为空或空白时,检查缺少的数据

时间:2016-01-27 08:26:08

标签: sql sql-server

我正在尝试检查ID是否存在数据但是没有相应的值,然后整行从输出中丢弃。如果value和id都为空,那么ok,那些行保留在输出

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 个答案:

答案 0 :(得分: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='')) 

但是你应该注意使用空字符串或null。存在显着差异。在您的示例中,您使用空字符串来显示数据缺失,上面的选择适用于空字符串。

答案 1 :(得分:1)

那么,为什么不直接这样做呢?当ID和值都为空时,或者ID和值都不为空时,您需要行。把它放到where子句中,重复3个id-value对,你就完成了。

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服务器应该可以正常工作。如果您不确定,可能需要查看How do I check if a Sql server string is null or empty