Có StartsWith hoặc Chứa trong t sql với các biến không?


94

Tôi đang cố gắng phát hiện xem máy chủ có đang chạy Express Edition hay không.

Tôi có sql t sau đây.

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

print @edition

Trong ví dụ của tôi, @edition = Express Edition (64-bit)

Tôi có thể làm như thế nào sau đây? (C # lấy cảm hứng).

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

Câu trả lời:


122

Bắt đầu với

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

Chứa đựng

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

Ví dụ

left chức năng

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

iif chức năng (bắt đầu với SQL Server 2012)

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

charindex chức năng

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

1
Lưu ý rằng bên trong chúng hoạt động khác nhau, đặc biệt là hiệu suất wrt và việc sử dụng các chỉ mục. Ví dụ: một truy vấn sử dụng colName LIKE 'prefix%'sẽ rất nhanh khi colNameđược lập chỉ mục, nhưng colName LIKE '%substring%'hoặc colName LIKE '%suffix'sẽ chậm vì SQL Server không tạo cây hậu tố khi lập chỉ mục văn bản. Tương tự, sử dụng LEFTvới một cột cũng sẽ chậm vì những truy vấn đó không phải là SARGable. SARGability rất quan trọng: dba.stackexchange.com/questions/162263/…
Dai

Tôi khuyên bạn nên thử nghiệm phương pháp LIKE 'x%' được đề cập bên dưới. Trong một số trường hợp, nó nhanh hơn nhiều
Tony Sepia

72

Có vẻ như những gì bạn muốn là http://msdn.microsoft.com/en-us/library/ms186323.aspx .

Trong ví dụ của bạn, nó sẽ là (bắt đầu bằng):

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

Hoặc chứa

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

Tại sao không sử dụng LIKE Express Edition%? Ngoài ra, giải pháp của bạn không trả về true của "Express Edition" có ở bất kỳ đâu trong chuỗi không? Vì vậy, nó đặc biệt hơn chỉ là một "Chứa" loại cách để làm việc đó
Don Cheadle

3
@mmcrae Mặc dù sử dụng phiên bản tương tự bên dưới sẽ ổn đây là cách đầu tiên tôi nghĩ đến và trông giống nhất với những gì OP có. Ngoài ra, biểu thức đầu tiên sẽ chỉ trả về true nếu biến bắt đầu bằng (charindex trả về 1) đối số đã cho. Biểu thức thứ hai là hàm chứa vì nó sẽ trả về true nếu đối số được tìm thấy ở bất kỳ đâu trong chuỗi (charindex trả về 1 hoặc lớn hơn).
Gary.S

45

tôi sẽ dùng

like 'Express Edition%'

Thí dụ:

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

Nếu bạn đọc câu hỏi, nó không phải là một truy vấn. Hãy thử ví dụ của tôi với câu trả lời của bạn và sau đó vui lòng cập nhật câu trả lời của bạn cho thấy nó hoạt động.
Valamas

Bạn có thể sử dụng like trong câu lệnh if trong t-sql. Đây là lý do tại sao tôi sử dụng like. Tôi không hiểu tại sao bạn muốn cho tôi điểm trừ cho điều đó nhưng tại sao không.
Thomas Koelle

9
Đây nên là cách ưu tiên; nó thanh lịch hơn, ít dài dòng hơn và "SQL căn chỉnh": vì nó sử dụng toán tử LIKE SQL tiêu chuẩn, tôi không cần phải đọc tài liệu để hiểu nó!
Fer García
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.