2011-12-09 22 views
5

Quiero seleccionar filas de una tabla llamada Users donde la columna Logon es igual a - Sin embargo, también deseo devolver "Foo" o "FOO".¿Hay alguna manera en Oracle de hacer que una columna no distinga entre mayúsculas y minúsculas?

que podía hacer algo como:

SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO'; 

Y luego convertir mi parámetro a mayúsculas. Sin embargo, en nuestro código tenemos literalmente cientos de lugares donde tendríamos que actualizar esto.

¿Hay alguna manera de hacer que el esquema de la tabla no distinga entre mayúsculas y minúsculas por lo que estas consultas solo funcionarán sin modificaciones? ¡Gracias!

ACTUALIZACIÓN

preferiría no cambiar entre mayúsculas y minúsculas en la base de datos o en el nivel de sesión. Cambiar las consultas SQL es difícil ya que usamos .NET Entity Framework y tenemos consultas LINQ en esta tabla por todas partes. No parece que el EF sea compatible con la conversión automática de mayúsculas y minúsculas, a menos que desee cambiar también todas las consultas LINQ.

+0

Compruebe http://stackoverflow.com/questions/2001165/oracle-11g-case-insensi tivo por defecto – a1ex07

+0

Estoy buscando una forma de tener control de nivel de tabla y/o columna, no quiero cambiar toda la base de datos en este momento. –

Respuesta

3

Respondiendo a mi propia pregunta porque no creo que ninguna de las respuestas propuestas aborde realmente el problema.

Oracle no admite el concepto de tipo de columna insensible a mayúsculas y minúsculas, y la distinción entre mayúsculas y minúsculas solo se puede controlar en la base de datos o en el nivel de la sesión. Hay algunas formas de evitar esto, como hacer que la columna sea virtual o leer a través de una vista, pero cada una de ellas también requeriría que usted arrojara el operando correcto (como WHERE X = UPPER(:p1).

Terminé simplemente actualizando mi base de datos (que era una lista de nombres de usuario de Active Directory) para que los casos correctos, por lo que ya no tienen que comparar entre mayúsculas y minúsculas.

0

Usted podría configurar una vista en su mesa con todas las columnas idénticas, excepto por la columna afectada que se upshifted - algo así como:

create view v_Users as 
select Id, Name, UPPER(Logon) Logon, ... 
FROM Users 

- A continuación, hacer reemplazar un mundial en su código fuente para cambiar el nombre de la tabla al nombre de la vista, aunque si su tabla se llama Usuarios, podría ser bastante peligroso ...

+2

También tendría que cambiar todas sus consultas para pasar Logon como mayúsculas, que es lo que está tratando de evitar. –

+1

Sí, esta es una idea, igual tendría que volver a escribir todas las selecciones para convertir el operando correcto a mayúsculas. Si voy a hacer esto, también podría actualizar todos los lugares donde busco usuarios por Inicio de sesión, que creo que es lo que tengo que hacer :) –

1

No creo que pueda hacerlo solo por una columna. Puede probar el siguiente enfoque: haga que su columna Logon sea virtual como UPPER(s_Logon) (cree s_Logon, copie todos los valores de la columna existente Logon, elimine Logon, créelo como virtual). Creo que va a funcionar para SELECT s, pero para insert/update s tendrá que acceder a 's_Logon'. Espero que tenga sentido.

+0

¿No sería eso solo hacer que la columna siempre esté en mayúsculas? ? Todavía tengo que lanzar el operando correcto a mayúsculas cuando lo comparo. –

2

prefiero no cambiar entre mayúsculas y minúsculas en toda la base de datos o en la sesión nivel

¿Hay alguna manera de hacer que el esquema de la tabla no distinga entre mayúsculas y minúsculas así que estas consultas solo funcionarán sin modificaciones

Sí, es posible pero a partir de la versión Oracle 12cR2 y superior.Se podría definir a muchos niveles (columna, tablas, esquemas):

-- default 
CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100)); 

INSERT INTO tab2(i, name) VALUES (1, 'John'); 
INSERT INTO tab2(i, name) VALUES (2, 'Joe'); 
INSERT INTO tab2(i, name) VALUES (3, 'Billy'); 

SELECT /*csv*/ * 
FROM tab2 
WHERE name = 'jOHN' ; 
/* 
"I","NAME" 
no rows selected 
*/ 

SELECT /*csv*/ 
     column_id, 
     column_name, 
     collation 
FROM user_tab_columns 
WHERE table_name = 'TAB2' 
ORDER BY column_id; 
/* 
"COLUMN_ID","COLUMN_NAME","COLLATION" 
1,"I","" 
2,"NAME","USING_NLS_COMP" 
*/ 

Columna de nivel:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100) COLLATE BINARY_CI); 

INSERT INTO tab2(i, name) VALUES (1, 'John'); 
INSERT INTO tab2(i, name) VALUES (2, 'Joe'); 
INSERT INTO tab2(i, name) VALUES (3, 'Billy'); 

SELECT /*csv*/ * 
FROM tab2 
WHERE name = 'jOHN' ; 
/* 
"I","NAME" 
1,"John" 
*/ 

-- COLUMN LEVEL 

SELECT /*csv*/ 
     column_id, 
     column_name, 
     collation 
FROM user_tab_columns 
WHERE table_name = 'TAB2' 
ORDER BY column_id; 
/* 
"COLUMN_ID","COLUMN_NAME","COLLATION" 
1,"I","" 
2,"NAME","BINARY_CI" 
*/ 

nivel de tabla:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100)) 
DEFAULT COLLATION BINARY_CI; 

esquema de nivel:

CREATE USER myuser IDENTIFIED BY myuser 
DEFAULT TABLESPACE users 
DEFAULT COLLATION BINARY_CI; 
+1

Característica aseada - no había oído hablar de esto. Más aquí: https://oracle-base.com/articles/12c/column-level-collation-and-case-insensitive-database-12cr2 –

Cuestiones relacionadas