【问题标题】:Check Missing data when id is not null or blank当 id 不为空或为空时检查缺失数据
【发布时间】:2016-01-27 08:26:07
【问题描述】:

我正在尝试检查是否存在 ID 的数据,但不存在对应的值,然后从输出中丢弃整行。如果 value 和 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 薄膜 1 RJA1896 3033 35OHM UMA56 陶瓷 PVAN59 铁氧体

请分享您的专业知识。 谢谢

【问题讨论】:

  • 永远不要使用空字符串作为 NULL...
  • 您使用的是哪个数据库系统?
  • 调整你的例子,你需要那么多列吗?更好地描述为什么只返回那些行。
  • @jarlh:返回这些行是因为 ID 及其值已填充或两者均为空白我正在使用 sql2008
  • 所有行的 id 值为 1... 都是什么?

标签: sql sql-server


【解决方案1】:
  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='')) 

但是你应该小心使用空字符串或空值。存在显着差异。在您的示例中,您使用空字符串来显示缺少数据,并且上面的选择适用于空字符串。

【讨论】:

    【解决方案2】:

    好吧,为什么不直接做呢?当 ID 和 value 都为空,或者 ID 和 value 都不为空时,您需要行。将其放入 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

    【讨论】:

    • @jarlh: id 值是标识列,对不起,拼写错误
    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2017-05-05
    • 2010-10-20
    • 2021-05-19
    相关资源
    最近更新 更多