CASE WHEN (x) > i THEN LEFT (x, j) + y ELSE x END

CASE WHEN LEN (x) > i THEN LEFT (x, j) + y ELSE x END

我想知道 SQL 服务器中是否有单一功能,或者至少有一个没有条件的表单 CASE,可以替代以下功能:

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;

将return以下结果:

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

我尝试了 STUFF (character_expression, start, length, replaceWith_expression),但我找不到修改它以满足我的要求的方法。

这是您应该在表示层而不是数据库级别执行的操作。如果您希望 SQL、select 显示您想要显示的字段并在 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…