是否有带变量的ssql中的StartsWith或Contains?

Val*_*mas 86 sql t-sql sql-server-2008

我试图检测服务器是否正在运行Express Edition.

我有以下t sql.

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

print @edition
Run Code Online (Sandbox Code Playgroud)

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

我该怎么办?(C#启发).

DECLARE @isExpress bit;
set @isExpress = @edition.StartsWith('Express Edition');
Run Code Online (Sandbox Code Playgroud)

Kir*_*huk 108

以..开始

a) left(@edition, 15) = 'Express Edition'
b) charindex('Express Edition', @edition) = 1
Run Code Online (Sandbox Code Playgroud)

包含

charindex('Express Edition', @edition) >= 1
Run Code Online (Sandbox Code Playgroud)

例子

left 功能

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

iif 功能(从SQL Server 2012开始)

set @isExpress = iif(left(@edition, 15) = 'Express Edition', 1, 0);
Run Code Online (Sandbox Code Playgroud)

charindex 功能

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它们在内部的工作方式不同,尤其是性能及其索引的使用。例如,当对“colName”建立索引时,使用“colName LIKE 'prefix%'”的查询会非常快,但“colName LIKE '%substring%'”或“colName LIKE '%suffix'”会很慢,因为 SQL Server索引文本时不创建后缀树。同样,对列使用“LEFT”也会很慢,因为这些查询不可SARGable。SARGability 很重要:https://dba.stackexchange.com/questions/162263/what-does-the-word-sargable-really-mean (3认同)

Gar*_*y.S 71

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

在你的例子中它将是(开头):

set @isExpress = (CharIndex('Express Edition', @edition) = 1)
Run Code Online (Sandbox Code Playgroud)

或包含

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
Run Code Online (Sandbox Code Playgroud)

  • @mmcrae虽然使用下面的类似版本会很好,这是第一种想到的方式,看起来最像是OP.此外,如果变量以(charindex返回1)给定参数开头,则第一个表达式将仅返回true.第二个表达式是一个contains,因为如果在字符串中的任何地方找到参数,它将返回true(charindex返回1或更大). (3认同)

Tho*_*lle 35

我会用

like 'Express Edition%'
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是首选方式; 它更优雅,更简洁,"SQL对齐":因为它使用标准的SQL LIKE运算符,所以我不需要阅读文档来理解它! (6认同)
  • 您可以在 t-sql 的 if 语句中使用 like 。这就是我使用like的原因。我不明白你为什么要为此给我扣分,但为什么不呢? (2认同)

小智 5

以下是对过滤数据时可以执行的操作的说明 - 最后,您只需将变量传递到需要的地方即可。

WHERE CustomerName LIKE 'a%'
--Finds any values that start with "a"

WHERE CustomerName LIKE '%a'
--Finds any values that end with "a"

WHERE CustomerName LIKE '%or%'
--Finds any values that have "or" in any position

WHERE CustomerName LIKE '_r%'
--Finds any values that have "r" in the second position

WHERE CustomerName LIKE 'a__%'
--Finds any values that start with "a" and are at least 3 characters in length

WHERE ContactName LIKE 'a%o'
--Finds any values that start with "a" and ends with "o"

SELECT * FROM my_table WHERE upper(my_column) LIKE 'SEARCHED%';
--Starts with, case insensitive 

SELECT * FROM my_table WHERE upper(my_column) LIKE '%SEARCHED';
--Ends with, case insensitive

SELECT * FROM my_table WHERE upper(my_column) LIKE '%SEARCHED%';
--Contains, case insensitive
Run Code Online (Sandbox Code Playgroud)