TSQL计算列限制

bev*_*qua 2 sql t-sql sql-server calculated-columns sql-server-2008

CREATE TABLE [dbo].[MembershipModule](
 [Id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
 [ParentId] [uniqueidentifier] NULL,
 [TargetId] [int] NULL,
 [WebContentId] [uniqueidentifier] NULL,
 [Name] [varchar](35) NOT NULL,
 [NameUpper]  AS (isnull(upper([Name]),'')) PERSISTED NOT NULL,
 [UriPrefix] [varchar](max) NULL,
 [UriText] [varchar](max) NULL,
 [UriComputed]  AS ??? PERSISTED,
 [Description] [varchar](100) NULL,
 [Created] [date] NOT NULL,
 [Modified] [datetime2](7) NOT NULL,
 [MenuItem] [bit] NOT NULL,
 [Enabled] [bit] NOT NULL,
 [Position] [smallint] NULL,
 CONSTRAINT [PK_MembershipModule] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

到目前为止,UriComputed字段的计算方式如下:

lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))
Run Code Online (Sandbox Code Playgroud)

这会产生如下输出

结果

现在,我想要终止所有UriComputed值'/'.通过添加+ '/'到计算字段可以很容易地实现这一点,除了"无文字"uris这样的事实将像//一样终止,我不想发生这种情况.

因为我可以放入计算字段的sql是非常有限的(我真的不知道这些限制的范围)我想我会在这里问如何添加这个.

基本上我想要图像中的输出

/a/login/
/a/announcements/
/a/
/
Run Code Online (Sandbox Code Playgroud)

我最近的尝试是:

isnull(convert(varchar(MAX),nullif(len(coalesce([UriText],[Name])),0)),'/')
Run Code Online (Sandbox Code Playgroud)

这有点混乱,如果它应该以'/'结尾,则添加一个数字,并在应该添加'/'时,我需要的是相反的(即,当长度为0时,'/', '' 除此以外)

如果有一个内联if或类似的东西,我可以使用它基本上是它,但我不知道.

谢谢!

OMG*_*ies 5

这对我有用:

[UriComputed]  AS (CASE 
                     WHEN RIGHT(lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')), 1) = '/' THEN
                       lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))
                     ELSE
                       lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')) +'/'
                   END) PERSISTED,
Run Code Online (Sandbox Code Playgroud)

完整的CREATE TABLE语句:

CREATE TABLE [dbo].[MembershipModule](
 [Id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
 [ParentId] [uniqueidentifier] NULL,
 [TargetId] [int] NULL,
 [WebContentId] [uniqueidentifier] NULL,
 [Name] [varchar](35) NOT NULL,
 [NameUpper]  AS (isnull(upper([Name]),'')) PERSISTED NOT NULL,
 [UriPrefix] [varchar](max) NULL,
 [UriText] [varchar](max) NULL,
 [UriComputed]  AS (CASE 
                     WHEN RIGHT(lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')), 1) = '/' THEN
                       lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))
                     ELSE
                       lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')) +'/'
                    END) PERSISTED,
 [Description] [varchar](100) NULL,
 [Created] [date] NOT NULL,
 [Modified] [datetime2](7) NOT NULL,
 [MenuItem] [bit] NOT NULL,
 [Enabled] [bit] NOT NULL,
 [Position] [smallint] NULL)
Run Code Online (Sandbox Code Playgroud)