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

为什么“SELECT DISTINCT a,b FROM…”返回的记录少于“SELECT DISTINCT a+'|'+b FROM…”?

  •  7
  • clweeks  · 技术社区  · 14 年前

    SELECT DISTINCT a, b, c, ... FROM big_dumb_flat_table
    

    它返回一堆记录(10986590)。当我替换选择列表中的逗号以将其格式化为管道分隔的串联字符串时:

    SELECT DISTINCT a + '|' + b + '|' + c + '|' + ... FROM big_dumb_flat_table
    

    它又返回了248张唱片。我向自己保证,在任何一个字段中都没有管道会影响返回集的保真度。这是怎么回事?

    2 回复  |  直到 14 年前
        1
  •  10
  •   Martin Smith    14 年前

    尾随空格可能导致这种情况。对于字符串比较,这些将被忽略。

    CREATE TABLE #T
    (
    a varchar(10),
    b varchar(10),
    c varchar(10)
    )
    
    INSERT INTO #T
    SELECT 'a ' as a, 'b' as b, 'c ' as c union all
    SELECT 'a' as a, 'b' as b, 'c ' as c
    
    SELECT DISTINCT a, b, c  
    FROM #T /*1 result*/
    
    SELECT DISTINCT a + '|' + b + '|' + c + '|'   
    FROM #T /*2 results*/
    
    
    SELECT DISTINCT LTRIM(RTRIM(a)) + '|' + LTRIM(RTRIM(b)) + '|' +
                    LTRIM(RTRIM(c)) + '|'   
    FROM #T /*1 result*/
    
        2
  •  2
  •   bzarah    14 年前

    我想不出有什么情况能让你 只有更少的记录。我将通过只选择一个+“|”,然后添加更多的列来简化查询。