我需要在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())
,因为这将纯粹以整数形式返回最大长度。
感谢您提前提供任何帮助,因为我有点陷入困境。
谢谢:)
答案 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