2009-12-02 14 views
86

Quiero hacer una búsqueda sensible a mayúsculas/minúsculas en mi consulta SQL. Pero de forma predeterminada, SQL Server no tiene en cuenta el caso de las cadenas.¿Cómo hacer una búsqueda sensible a mayúsculas y minúsculas en la cláusula WHERE (estoy usando SQL Server)?

¿Alguna idea sobre cómo hacer una búsqueda sensible a mayúsculas y minúsculas en consultas SQL?

+0

Este enlace puede ayudarlo http://www.codefari.com/2015/09/case-sensitive-search-on-column-in-sql.html – Singh

Respuesta

89

Se puede hacer a través de changing the Collation. Por defecto es insensible a mayúsculas/minúsculas.

Extracto del enlace:

SELECT 1 
FROM dbo.Customers 
WHERE CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS 
    AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS 
+0

Cómo usar cuando tenemos en lugar de eso =. como WHERE ID de Cust en (@CustID) – rinuthomaz

140

Mediante el uso de colación o fundición a binario, como esto:

SELECT * 
FROM Users 
WHERE 
    Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS 
    AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS 
    AND Username = @Username 
    AND Password = @Password 

La duplicación de nombre de usuario/existe contraseña para dar el motor de la posibilidad de utilizar índices . La intercalación anterior es una intercalación de mayúsculas y minúsculas, cámbiela a la que necesita si es necesario.

La segunda, echando a binario, se podría hacer así:

SELECT * 
FROM Users 
WHERE 
    CAST(Username as varbinary(100)) = CAST(@Username as varbinary)) 
    AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100)) 
    AND Username = @Username 
    AND Password = @Password 
+8

Las personas que leen esta pregunta también pueden encontrar útil leer cómo cambiar la columna para que distinga entre mayúsculas y minúsculas, lo que elimina la necesidad de utilizar la intercalación en la cláusula WHERE. Ver: http://stackoverflow.com/a/485394/908677 –

+0

El elenco como método varbinary funcionó para mí cuando se usa directamente en la base de datos, pero no funcionó cuando se enviaba la misma declaración desde una aplicación .NET, ni idea por qué . Pero el método de clasificación funcionó bien. – Doug

+1

Esta respuesta sería perfecta si incluía una explicación de dónde colocar el término buscado, es decir, dónde se insertaría la frase similar a una búsqueda de SQL 'como' * de palabra o frase * "'. –

13

Usted puede hacer la consulta utilizando convertir a varbinary - es muy fácil. Ejemplo:

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 
8

USO BINARY_CHECKSUM

SELECT 
FROM Users 
WHERE 
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username) 
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password) 
+0

¿No significaría esto que ya no es una comparación exacta?¿A veces puede ser cierto que no es lo mismo? –

+1

Estoy de acuerdo @ O'Rooney esto ocasionalmente devolverá falsos positivos. –

4

uso HASHBYTES

declare @first_value nvarchar(1) = 'a' 
declare @second_value navarchar(1) = 'A' 

if HASHBYTES('SHA1',@first_value) = HASHBYTES('SHA1',@second_value) begin 
    print 'equal' 
end else begin 
    print 'not equal' 
end 

-- output: 
-- not equal 

... en donde cláusula

declare @example table (ValueA nvarchar(1), ValueB nvarchar(1)) 

insert into @example (ValueA, ValueB) 
values ('a', 'A'), 
     ('a', 'a'), 
     ('a', 'b') 

select ValueA + ' = ' + ValueB 
from @example 
where hashbytes('SHA1', ValueA) = hashbytes('SHA1', ValueB) 

-- output: 
-- a = a 

select ValueA + ' <> ' + ValueB 
from @example 
where hashbytes('SHA1', ValueA) <> hashbytes('SHA1', ValueB) 

-- output: 
-- a <> A 
-- a <> b 

o para encontrar un valor

declare @value_b nvarchar(1) = 'A' 

select ValueB + ' = ' + @value_b 
from @example 
where hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b) 

-- output: 
-- A = A 
2

En MySQL Si no desea cambiar el cotejo y desea llevar a cabo caso de búsqueda sensible a continuación, sólo tiene que utilizar binaria palabra clave de esta manera:

SELECT * FROM table_name WHERE binary [email protected]_parameter and binary [email protected]_parameter 
+0

Esa no es una consulta válida de SQL Server. Creo que es MySQL –

+1

Funciona perfectamente en MySQL –

1

latin1_general_cs uso como su colación en su sql db

Cuestiones relacionadas