2015-01-07 21 views
0

不知有是SQL Server單功能,或至少沒有條件CASE一種形式,可以替代以下功能:CASE WHEN LEN(x)的>然後我LEFT(X,j)的+ Y ELSE X END

CASE WHEN LEN (character_expression) > result_length THEN LEFT (character_expression, resultWithoutPad_length) + padWith_expression ELSE character_expression END 

這樣

CREATE TABLE foo (bar VARCHAR (MAX)); 
INSERT INTO foo (bar) VALUES ('123456'), ('1234567'), ('12345678'), ('123456789'), ('1234567890'), ('12345678901'), ('123456789012'); 
SELECT CASE WHEN LEN (bar) > 10 THEN LEFT (bar, 7) + '...' ELSE bar END FROM foo; 

將返回以下結果:

(No column name) 
---------------- 
123456 
1234567 
12345678 
123456789 
1234567890 
1234567... 
1234567... 

我試過STUFF (character_expression, start, length, replaceWith_expression),但我找不到修改它以適合我的要求的方法。

+2

請問你的解決方案不能滿足您的需求? – Greg

+2

我沒有看到一個函數怎麼可能比你已經有的更簡單 – Kevin

+0

它適合。我只是不喜歡它的外觀,並懷疑是否有另一個更好看的。 – tjeloep

回答

1

這是你應該在表現層中做的事情,而不是在數據庫層面。如果你想擁有漂亮的SQL,選擇你想要顯示的字段並在HTML中添加一個省略號或者你的應用程序。

如果必須在數據庫級別做到這一點,你可以寫一個UDF:

CREATE FUNCTION ellipsis(@str VARCHAR(MAX), @len INT) RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    SET @str = CASE WHEN LEN(@str) > @len THEN LEFT(@str, @len - 1) + '…' ELSE @str END 
    RETURN @str 
END; 

GO 

CREATE TABLE foo (bar VARCHAR (MAX)); 

INSERT INTO foo (bar) VALUES ('123456'), ('1234567'), ('12345678'), ('123456789'), ('1234567890'), ('12345678901'), ('123456789012'); 

SELECT dbo.ellipsis(bar, 7) FROM foo; 

結果:

 
123456 
1234567 
123456… 
123456… 
123456… 
123456… 
123456… 
相關問題