数据库中有一个表,让我们调用这个表Document。 该表包含字段:
有确定版本顺序及其到期日期的规则。我将给出在C#3中查找版本的到期日期的规则,因为它看起来更容易用英语阅读。
var nextMinorVersion = Versions.FirstOrDefault((version) =>
(version.majorVersionNumber == currentVersion.majorVersionNumber) &&
(version.minorVersionNumber == currentVersion.minorVersionNumber + 1));
if (nextMinorVersion != null) return nextMinorVersion.ReleaseDate;
var nextMajorVersion = Versions.FirstOrDefault((version) =>
(version.majorVersionNumber == currentVersion.majorVersionNumber + 1) &&
(version.minorVersionNumber == 0));
if (nextMajorVersion != null) return nextMajorVersion.ReleaseDate;
return null;
现在必须在SQL for MS SQL Server 2005和2008中实现此规则。我尝试过并且只能组成非常繁琐,低效且难以理解的表达式。考虑到它在C#中看起来有多么微不足道,我认为我不能轻易做到这一点因为我不熟悉SQL。
我正在寻找一种在SQL中执行此操作的方法,其复杂性与C#相同。
抱歉这么狭隘的问题,我不知道如何概括这一点。关于概括问题及其标题的建议也非常感谢。
更新 对于那些没有使用C#3灵巧的人,我将尝试用伪代码解释规则:
if exists nextMinorVersion so that
nextMinorVersion.majorVersionNumber = currentVersion.majorVersionNumber and
nextMinorVersion.minorVersionNumber = currentVersion.minorVersionNumber + 1
then expirationDate = nextMinorVersion.ReleaseDate
else if exists nextMajorVersion so that
nextMajorVersion.majorVersionNumber = currentVersion.majorVersionNumber + 1 and
nextMinorVersion.majorVersionNumber = 0
then expirationDate = nextMajorVersion.ReleaseDate
else expirationDate = null
答案 0 :(得分:2)
我想我已经得到了它 - 比如:
SELECT TOP 1 ReleaseDate
FROM Versions
WHERE
(MajorVersion = @CurrentMajor AND MinorVersion = @CurrentMinor + 1)
OR (MajorVersion = @CurrentMajor + 1 AND MinorVersion = 0)
ORDER BY MajorVersion, MinorVersion
在我下面的测试数据中,任何1.x版本也检索2.0版本(因为它是一个OR子句),这是TOP 1和ORDER BY进入的地方 - 它只选择1.x记录,如果有的话之一。
如果版本是相互缠绕的(例如1.3在2.0之后发布),这也适用。
仅供参考我的表定义:
CREATE TABLE [dbo].[Versions](
[MajorVersion] [int] NOT NULL,
[MinorVersion] [int] NOT NULL,
[ReleaseDate] [datetime] NOT NULL,
CONSTRAINT [PK_Versions] PRIMARY KEY CLUSTERED
(
[MajorVersion] ASC,
[MinorVersion] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
插入一些数据:
INSERT INTO Versions VALUES (1, 0, '2009-01-01')
INSERT INTO Versions VALUES (1, 1, '2009-01-10')
INSERT INTO Versions VALUES (1, 2, '2009-01-21')
INSERT INTO Versions VALUES (2, 0, '2009-02-01')
INSERT INTO Versions VALUES (2, 1, '2009-02-20')
INSERT INTO Versions VALUES (1, 3, '2009-03-01')
尝试一下:
1.0 = 2009-01-10
1.1 = 2009-01-21
1.2 = 2009-03-01
1.3 = 2009-02-01
2.0 = 2009-02-20
2.1 = NULL (no rows)