我正在寻找一种简洁的方法来获取可选标记之前列的前导文本,在 SQL Server 2008 上(所以没有IIF
)。我有一nvarchar
列在文本中的某个点可能有也可能没有标记,我需要返回完整的列值(如果没有标记)或标记之前的位(如果有)。(这不是我的架构,我无法更改它。)
我看到了这些选择:
用
CHARINDEX
andSUBSTRING
来做,它既冗长又丑陋(见下文),或者创建一个函数来集中和隐藏丑陋,并使用它(见下文)。
有没有更好的内置选项?如果是这样,那是什么?(这个问题的答案很可能是“不”。)
(我认为谈论的这个答案PARSENAME
可能是一个选项,但是因为标记是可选的,所以它并没有真正的帮助,而且这样做而不是创建一个函数对我来说似乎有点 hacky...)
选项 #1 的示例:
SELECT
CASE
WHEN CHARINDEX('{}', data, 1) = 0 THEN
data
ELSE
SUBSTRING(data, 1, CHARINDEX('{}', data, 1) - 1)
END AS trimmedData
FROM ...
咳嗽。哈克。
选项 #2 的示例
SELECT dbo.StrUntil(data, '{}') as trimmedData
FROM ...
...在哪里dbo.StrUntil
是这样的:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'FN' AND name = 'StrUntil')
exec('CREATE FUNCTION [dbo].[StrUntil]() RETURNS INT AS BEGIN RETURN 0 END')
GO
ALTER FUNCTION [dbo].[StrUntil](
@str nvarchar(max),
@substr nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
RETURN CASE
WHEN CHARINDEX(@substr, @str, 1) = 0 THEN
@str
ELSE
SUBSTRING(@str, 1, CHARINDEX(@substr, @str, 1) - 1)
END
END