选择最长字符串 - SQL Server

时间:2018-04-09 08:00:11

标签: sql sql-server

我需要在SQL Server查询中选择最长的字符串。

我需要,LongDescription_c中最长的描述,当有内容或PartDescription中最长的时候。

目前,我们有很多同事在很久以前创建了以下查询:

SELECT        PartNum, 
              MAX(CASE WHEN LongDescription_c = '' THEN PartDescription ELSE LongDescription_c END) AS PartDesc
FROM            
              Part
GROUP BY 
              PartNum

这适用于很多情况,但不是全部,我相信其原因是MAX()。我相信这会按字母顺序返回,而不是MAX(LEN())这是我认为他想要的。但是,我无法弄清楚如何使用MAX(LEN()),因为这将纯粹以整数形式返回最大长度。

感谢您提前提供任何帮助,因为我有点陷入困境。

谢谢:)

4 个答案:

答案 0 :(得分:4)

按照@jarlh的说法,一种选择是使用TOP技巧:

SELECT TOP 1 *
FROM Part
ORDER BY
    LEN(CASE WHEN LongDescription_c = ''
             THEN PartDescription ELSE LongDescription_c END) DESC,
    CASE WHEN LongDescription_c = ''
             THEN PartDescription ELSE LongDescription_c END

在平局的情况下,它会首先报告按字母顺序排列的最低描述。

如果性能成为问题,那么添加索引是典型的事情。但在这种情况下,因为我们使用函数进行排序,所以无法使用索引。如果您确实需要性能,请考虑添加计算列来存储长度。

答案 1 :(得分:2)

以下查询会为您提供最长public static int MinimalDivisor(int n) { if ( n % 2 == 0) return 2; for(int d = 3; d < n/2; d=d+2) if (n % d == 0) return d; return n; }

的行
LongDescription_c

答案 2 :(得分:1)

您需要使用len()函数来检查字符串的长度

select top(1) with ties PartNum, * 
from table t
order by row_number() over (partition by PartNum order by 
                       len(CASE WHEN LongDescription_c = '' 
                                THEN PartDescription ELSE LongDescription_c END) desc)

答案 3 :(得分:0)

我认为你的同事查询错了。

如果您的LongDescription_c始终长于PartDescription列,并且只需要在LongDescription不可用时显示PartDescription,则可以使用更简单的查询

SELECT PartNum, IIF(LEN(LongDescription_c)>=LEN(PartDescription),LongDescription_c,PartDescription)
FROM Part