Sql Return";名称“;“带值的s”;即;只有当;版本;is>;=8

Sql Return";名称“;“带值的s”;即;只有当;版本;is>;=8,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,很抱歉问题中的措辞太糟糕,很难正确解释 我有一张这样的桌子: Id Name Version 1 Chrome 38.0 2 Chrome 36.0 3 Chrome 37.0 4 Firefox 31.0 5 IE 11.0 6 IE 8.0 7 IE 7.0 仅当“版本”大于等于8.0时,我需要一个查询来返回值为“IE”的“Name” 否则不要返回版本,我希望结果是 Id Name Version 1 Ch

很抱歉问题中的措辞太糟糕,很难正确解释

我有一张这样的桌子:

Id  Name    Version
1   Chrome  38.0
2   Chrome  36.0
3   Chrome  37.0
4   Firefox 31.0
5   IE      11.0
6   IE      8.0
7   IE      7.0
仅当“版本”大于等于8.0时,我需要一个查询来返回值为“IE”的“Name” 否则不要返回版本,我希望结果是

Id  Name    Version
1   Chrome  null
2   Chrome  null
3   Chrome  null
4   Firefox null
5   IE      11.0
6   IE      8.0
如果到目前为止我的存储过程有帮助的话,它将返回我不想要的所有版本

ALTER PROCEDURE [dbo].[GetCommonBrowserCount]
    @StartDate datetime = NULL,
    @EndDate datetime = NULL,
    @Domain varchar(255) = NULL

    AS
    BEGIN

    SET NOCOUNT ON;

    SELECT 
        [Name],
        COUNT(Name) AS [Count],
        [Version]
    FROM 
        dbo.GetCommonBrowserAccessEvents
    WHERE
        (
            @StartDate IS NULL OR [Date] > @StartDate
        )
        AND
        (
            @EndDate IS NULL OR [Date] < @EndDate
        )
        AND
        (
            @Domain IS NULL OR DomainName = @Domain
        )
    GROUP BY Name,
            [Version]
END
ALTER过程[dbo]。[GetCommonBrowserCount]
@StartDate datetime=NULL,
@EndDate datetime=NULL,
@域varchar(255)=空
作为
开始
不计数;
挑选
[姓名],
计数(名称)为[计数],
[版本]
从…起
dbo.GetCommonBrowserAccessEvents
哪里
(
@StartDate为空或[Date]>@StartDate
)
及
(
@EndDate为空或[日期]<@EndDate
)
及
(
@域为空或DomainName=@Domain
)
按名称分组,
[版本]
结束

这可能吗?

使用
案例

select id, 
       name,
       case when name = 'IE' 
            then version
            else null
       end as version
from GetCommonBrowserAccessEvents
where not 
(
   name = 'IE' and cast(substring(version, 1, charindex('.', version) - 1) as int) < 8
)
选择id,
名称
名称='IE'时的大小写
然后版本
否则无效
以版本结束
从GetCommonBrowserAccessEvents
哪里没有
(
name='IE'和cast(子字符串(版本,1,charindex('.',版本)-1)为int)<8
)

限制结果集只需在
WHERE
子句中添加另一个

AND
(
    [Name] <> 'IE' OR [Version] > 8
)

(如果您使用的是SQL Server 2012或更高版本,您可以使用更简洁一点,但在2008年则不行。)

这正是我的偏好。我将日期参数默认为最小值和最大值,而不是NULL。(即:
@StartDate='1/1/1900'
@EndDate='12/31/2050'
)这使得WHERE子句更易于阅读。(即:
其中,[Date]介于@StartDate和@EndDate之间,并且……
SELECT
-- ...
CASE WHEN [Name] = 'IE' THEN [Version] ELSE NULL END AS Version
SELECT 
    [Name],
    CASE 
        WHEN 
            [Name] = "IE" AND [Version] >= 8 
        THEN 
            [Version] 
        ELSE 
            NULL 
    END AS [Version]
FROM 
    dbo.GetCommonBrowserAccessEvents
WHERE
    Name != "IE"
    OR
    (Name = "IE" AND Version >= 8)