【问题标题】:Is there StartsWith or Contains in t sql with variables?t sql 中是否有 StartsWith 或 Contains 变量?
【发布时间】:2012-03-18 15:03:32
【问题描述】:

我正在尝试检测服务器是否正在运行 Express Edition。

我有以下 t sql。

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

print @edition

在我的例子中,@edition = Express Edition (64-bit)

我该如何执行以下操作? (受 C# 启发)。

DECLARE @isExpress bit;
set @isExpress = @edition.StartsWith('Express Edition');

【问题讨论】:

    标签: sql sql-server-2008 tsql


    【解决方案1】:

    开始

    a) left(@edition, 15) = 'Express Edition'
    b) charindex('Express Edition', @edition) = 1
    

    包含

    charindex('Express Edition', @edition) >= 1
    

    示例

    left函数

    set @isExpress = case when left(@edition, 15) = 'Express Edition' then 1 else 0 end
    

    iif 函数(从 SQL Server 2012 开始)

    set @isExpress = iif(left(@edition, 15) = 'Express Edition', 1, 0);
    

    charindex函数

    set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
    

    【讨论】:

    • 请注意,在内部这些工作方式不同,尤其是 w.r.t.性能及其对索引的使用。例如,使用colName LIKE 'prefix%' 的查询在为colName 编制索引时会非常快,但colName LIKE '%substring%'colName LIKE '%suffix' 会很慢,因为SQL Server 在索引文本时不会创建后缀树。同样,将LEFT 与列一起使用也会很慢,因为这些查询不是 SARGable。 SARGability 很重要:dba.stackexchange.com/questions/162263/…
    • 我建议测试下面提到的 LIKE 'x%' 方法。在某些情况下,它要快得多
    • 逻辑上我会避免使用 charindex.. 我会假设 char index 会搜索整个字符串以找到第一个字符,然后检查第二个字符等。例如,它不会意识到你不感兴趣如果字符串从位置 2 或更大的位置开始
    【解决方案2】:

    看来你想要的是http://msdn.microsoft.com/en-us/library/ms186323.aspx

    在您的示例中,它将是(开头):

    set @isExpress = (CharIndex('Express Edition', @edition) = 1)
    

    或包含

    set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
    

    【讨论】:

    • 为什么不使用 LIKE Express Edition% ?另外,您的解决方案是否返回 true 的“Express Edition”是否在字符串中的任何位置?所以更具体地说,它只是一种“包含”的方式
    • @mmcrae 虽然使用下面的类似版本会很好,但这是我想到的第一种方式,看起来最像 OP 所拥有的。此外,只有当变量以(charindex 返回 1)给定参数开头时,第一个表达式才会返回 true。第二个表达式是 contains,因为如果在字符串中的任何位置找到参数(charindex 返回 1 或更大),它将返回 true。
    【解决方案3】:

    我会用

    like 'Express Edition%'
    

    例子:

    DECLARE @edition varchar(50); 
    set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)
    
    DECLARE @isExpress bit
    if @edition like 'Express Edition%'
        set @isExpress = 1;
    else
        set @isExpress = 0;
    
    print @isExpress
    

    【讨论】:

    • 如果你读了这个问题,那不是一个查询。用你的答案试试我的例子,然后请更新你的答案,证明它有效。
    • 您可以在 t-sql 的 if 语句中使用 like。这就是我使用like的原因。我不明白你为什么要给我减分,但为什么不呢。
    • 这应该是首选方式;它更优雅、更少冗长和“SQL 对齐”:因为它使用标准 SQL LIKE 运算符,我不需要阅读文档来理解它!
    猜你喜欢
    • 2011-03-24
    • 2011-08-25
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多