代码之家  ›  专栏  ›  技术社区  ›  dretzlaff17

处理空字符串值和空字符串值时编写联合查询的最佳方法

  •  2
  • dretzlaff17  · 技术社区  · 14 年前

    我必须编写一个查询,在两个具有相似数据的表之间执行联合。结果必须是明显的。我遇到的问题是,对于空值,一些字段应该是相同的。有些被指示为空,有些则具有空字符串值。我的问题是,是否有更好的方法来执行以下查询?(不固定实际数据以确保设置了正确的默认值等)在性能受到重大影响时会使用这种情况吗?

    Select  
        When Column1 = '' Then NULL Else Column1 as [Column1],
        When Column2 = '' Then NULL Else Column2 as [Column2]
    From TableA
    
    UNION ALL
    
    Select 
        When Column1 = '' Then NULL Else Column1 as [Column1],
        When Column2 = '' Then NULL Else Column2 as [Column2]
    From TableB
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   Joe Stefanelli    14 年前

    我认为这对表演没有什么影响,但是 NULLIF 是写这个的另一种方式,而且,我觉得,看起来有点干净。

    Select  
        NULLIF(Column1, '') as [Column1],
        NULLIF(Column2, '') as [Column2]
    From TableA
    
    UNION
    
    Select 
        NULLIF(Column1, '') as [Column1],
        NULLIF(Column2, '') as [Column2]
    From TableB
    
        2
  •  1
  •   OMG Ponies    14 年前

    使用 UNION 删除重复项-比 UNION ALL 对于此功能:

    SELECT CASE 
             WHEN LEN(LTRIM(RTRIM(column1))) = 0 THEN NULL
             ELSE column1
           END AS column1,
           CASE 
             WHEN LEN(LTRIM(RTRIM(column2))) = 0 THEN NULL
             ELSE column2
           END AS column2
      FROM TableA
    UNION 
    SELECT CASE 
             WHEN LEN(LTRIM(RTRIM(column1))) = 0 THEN NULL
             ELSE column1
           END,
           CASE 
             WHEN LEN(LTRIM(RTRIM(column2))) = 0 THEN NULL
             ELSE column2
           END 
      FROM TableB
    

    如果列值包含任意数量的空格并且没有实际内容,我将逻辑更改为返回空。

    CASE 表达式是ansi,比nullif/etc语法更可自定义。

        3
  •  1
  •   Andomar    14 年前

    Case 应该表现不错,但是 IsNull 在这种情况下更自然。如果要搜索不同的行,请执行 union 而不是 union all 将实现这一目标(感谢Jeffrey L Whitledge指出这一点):

    select  IsNull(col1, '')
    ,       IsNull(col2, '')
    from    TableA
    union
    select  IsNull(col1, '')
    ,       IsNull(col2, '')
    from    TableB
    
        4
  •  0
  •   Beth    14 年前

    如果在单独的视图中执行所需的任何操作(用空字符串替换空字符串),则可以将操作操作操作与联合分离,然后对视图进行联合。

    不过,您不应该在两个集合上都应用相同的操作。

    如果是这样的话,首先将它们联合起来,然后将操作应用于结果的、联合起来的集合一次。

    一半的操作代码支持这种方式。