2011-11-17 41 views
18

Làm cách nào để tìm các giá trị cột có tất cả các chữ cái? Giống như LastName = 'SMITH' thay vì 'Smith'Làm thế nào để tìm giá trị trong tất cả các mũ trong SQL Server?

Dưới đây là những gì tôi đã cố gắng ...

SELECT * 
    FROM MyTable 
WHERE FirstName = UPPER(FirstName) 
+1

Điều đó sẽ làm việc. Bạn nhận được kết quả gì? – Polynomial

+0

@Polynomial, tôi chỉ nhận được kết quả tương tự như khi tôi chạy "WHERE FirstName = FirstName" ... có lẽ là mã hóa cần phải được khác nhau (nếu có ý nghĩa .. idk gì im nói về chính xác) – daveomcd

Trả lời

38

Bạn có thể bắt buộc đối chiếu phân biệt chữ hoa chữ thường;

select * from T 
    where fld = upper(fld) collate SQL_Latin1_General_CP1_CS_AS 
1

Theo mặc định, so sánh SQL là case-insensitive.

0

Bạn có thể thử sử dụng điều này làm mệnh đề where?

WHERE PATINDEX(FirstName + '%',UPPER(FirstName)) = 1 
0

Có một cái nhìn here

Có vẻ bạn có một vài lựa chọn

  • đúc chuỗi để VARBINARY (chiều dài)

  • sử dụng đối chiếu để xác định một collation case-sensitive

  • tính toán thứ e BINARY_CHECKSUM() của chuỗi để so sánh

  • thay đổi sở hữu COLLATION cột của bảng

  • sử dụng tính cột (tính tiềm ẩn của VARBINARY)

1

Bạn cần phải sử dụng một collation máy chủ đó là trường hợp nhạy cảm như vậy:

SELECT * 
FROM MyTable 
WHERE FirstName = UPPER(FirstName) Collate SQL_Latin1_General_CP1_CS_AS 
5

Hãy thử

SELECT * 
    FROM MyTable 
WHERE FirstName = UPPER(FirstName) COLLATE SQL_Latin1_General_CP1_CS_AS 

collation này cho phép so sánh trường hợp nhạy cảm.

Nếu bạn muốn thay đổi collation của cơ sở dữ liệu của bạn, do đó bạn không cần phải thể chỉ định một collation trường hợp nhạy cảm trong các truy vấn của bạn, bạn cần phải làm như sau (from MSDN):

1) Đảm bảo bạn có tất cả thông tin hoặc tập lệnh cần thiết để tạo lại cơ sở dữ liệu người dùng của bạn và tất cả các đối tượng trong đó.

2) Xuất tất cả dữ liệu của bạn bằng công cụ như Tiện ích bcp.

3) Thả tất cả cơ sở dữ liệu người dùng.

4) Xây dựng lại cơ sở dữ liệu chính chỉ định collation mới trong thuộc tính SQLCOLLATION của lệnh thiết lập. Ví dụ:

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName 
/SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ] 
/SQLCOLLATION=CollationName 

5) Tạo tất cả cơ sở dữ liệu và tất cả các đối tượng trong đó.

6) Nhập tất cả dữ liệu của bạn.

0

Hãy thử này

SELECT * 
FROM MyTable 
WHERE UPPER(FirstName) COLLATE Latin1_General_CS_AS = FirstName COLLATE Latin1_General_CS_AS 
0

Tôi tạo ra một đơn giản UDF cho rằng:

create function dbo.fnIsStringAllUppercase(@input nvarchar(max)) returns bit 

    as 

begin 

    if (ISNUMERIC(@input) = 0 AND RTRIM(LTRIM(@input)) > '' AND @input = UPPER(@input COLLATE Latin1_General_CS_AS)) 
     return 1; 

    return 0; 
end 

Sau đó, bạn có thể dễ dàng sử dụng nó trên bất kỳ cột trong Điều khoản WHERE.

Để sử dụng ví dụ OP:

SELECT * 
FROM MyTable 
WHERE dbo.fnIsStringAllUppercase(FirstName) = 1 
Các vấn đề liên quan