2012-05-01 4 views
0

필자는 필드 값을 100 자로 자르고 다음을 추가하는 선택 문을 알아 내려고합니다.필드를 자르고 "..."을 어떻게 추가합니까?

HundredLetterSentence가 HundredLetter Sen ... 또는 이와 비슷한 내용이됩니다. 여기 내 저장 프로 시저의 select 문이 있습니다. 나는 여기에서 약간 붙어있다. Select TOP (1) 설명은 잘라내기를 수행 할 위치입니다.

SELECT  [TI].[TicketID] 
     , CAST([TI].[Subject] AS VARCHAR(100)) [Subject] 
     , [TA].[DueDate] 
     , CAST(
        ( SELECT 
         TOP(1)  SUBSTRING(Description, 0, 100) 
         FROM  Comment 
         WHERE  TicketID = [TI].[TicketID] 
         ORDER BY CommentDate DESC 
        ) AS VARCHAR(100) 
       ) AS [Description] 
FROM  [dbo].[Ticket]  [TI] 
INNER JOIN [dbo].[Task]  [TA] 
ON   [TI].[TicketID]  = [TA].[TicketID] 
INNER JOIN [dbo].[Task_Status] [TS] 
ON   [TA].[StatusID]  = [TS].[StatusID] 
WHERE  [TI].[IsDeleted] = 0 
AND   [TS].[IsDeleted] = 0 
AND   [TS].[Status]  = 'Open' 
AND   [TI].[AssigneeView] IS NULL 
AND   [TI].[AssignedTo] = @AssignedTo 

답변

1

는 뭔가 같은 -

SELECT CASE 
      WHEN (LEN(Table1.LongText) < 100) THEN Table1.LongText 
      ELSE SUBSTRING(Table1.LongText,1, 97) + '...' 
     END AS [Description] 
FROM Table1; 
+0

죄송합니다 - 게시물을 다시 읽었을 때 "100 자까지 자릅니다"라고 말한 것을보고 필드의 총 길이를 100 자로했습니다 :) 97을 100으로 바꿀 수 있습니다 (또는 원하는 길이로자를 수 있습니다). –

1

여기서 가장 좋은 방법은 User Defined Function (UDF)을 만드는 것입니다. 당신이 할 것이다 당신의 SELECT 문에 그런

IF LEN(@Value)>100 
BEGIN 
    SET @Value = SUBSTRING(@Value, 0, 100) + '...' 
END 
RETURN @Value 

: 당신이 뭔가를했을이 UDF에서

작동합니다 어떤

SELECT [TI].[TicketID], dbo.TruncateString([TI].[Subject]) ..... 
+3

간단한 문자열 작업을 수행하기 위해 실제로 SELECT 목록에 UDF를 사용하지 않는 것이 좋습니다. 왜? 글쎄, 발사를하고 많은 행을 가진 테이블에 대해 그렇게 할 때 어떤 일이 일어나는 지보십시오. :-) –

0
;WITH x (d, tid, rn) AS 
(
    SELECT SUBSTRING(Description, 1, 100) + CASE 
    WHEN LEN(Description) > 100 THEN '...' ELSE '' END, 
    TicketID, rn = ROW_NUMBER() OVER 
    (PARTITION BY TicketID ORDER BY CommentDate DESC) 
    FROM dbo.Comment 
) 
SELECT [TI].[TicketID], 
    CAST([TI].[Subject] AS VARCHAR(100)) [Subject], 
    [TA].[DueDate], 
    x.d AS [Description] 
    FROM  [dbo].[Ticket] [TI] 
      INNER JOIN [dbo].[Task] [TA] ON [TI].[TicketID] = [TA].[TicketID] 
      INNER JOIN [dbo].[Task_Status] [TS] ON [TA].[StatusID] = [TS].[StatusID] 
    LEFT OUTER JOIN x ON TI.TicketID = x.tid 
    AND x.rn = 1 -- oops, forgot this important part 
    WHERE [TI].[IsDeleted] = 0 AND 
      [TS].[IsDeleted] = 0 AND 
      [TS].[Status] = 'Open' AND 
      [TI].[AssigneeView] IS NULL AND 
      [TI].[AssignedTo] = @AssignedTo; 
0

할 모든 필드에 '...'또는 실제로 100자를 넘는 필드 만 필요합니다. 모두 필요한 경우 다음과 같이 할 수 있습니다.

select substring(name,0,97)+'...' from... 
관련 문제