2012-06-14 12 views
6

Mi pregunta es: En Oracle regexp_like funciona solo en la cláusula where sin tener que comparar con 1 o 0 o una cadena. La función solo se puede invocar cuando se evalúa algo en una sentencia case o en la cláusula where. Como no se puede describir (intenté buscar en el diccionario de datos), me pregunto cómo escribir una función que funcione de la misma manera.¿Cómo escribir una función que solo se usa en la cláusula where que se evalúa como verdadera sin un operador de comparación?

Por ejemplo:

function is_prod 
returns boolean 
is 
    l_var boolean := false; 
begin 
    if sys_context('userenv','db_unique_name') = '"PROD_SERVER"' then 
    l_var := true; 
    end if; 
return l_var; 
end; 

Esa función compila, pero no se puede utilizar en una instrucción SQL como la siguiente:

select * 
from table t 
where is_prod 

Porque me sale el siguiente error: ORA-00920: operador relacional inválido.

Compararlo con un número o verdadero tampoco funciona.

¿Dónde puedo encontrar el código base para regexp_like o qué debo hacer para que funcione como regexp_like?

Nota: He mirado alrededor durante varias horas y he descubierto que las funciones de expresiones regulares de Oracle son en realidad llamadas Java, pero eso significa que todavía necesitan un contenedor pl/sql.

+4

+1 Estaría muy interesado en ver la respuesta a esto, pero al mismo tiempo tengo que preguntarme en qué momento el tiempo dedicado a resolver este problema supera el tiempo dedicado a escribir "= 1". Espero que la respuesta esté en unos 10 años. – GarethD

+0

@GarethD Sí, me he preguntado lo mismo. Me encantaría ver PL/SQL actuar más como un lenguaje orientado a objetos que un lenguaje de procedimientos :) Y, sabemos que se puede hacer debido al ejemplo que dio ('regexp_like') puede hacerlo. – kentcdodds

+4

'REGEXP_LIKE' es una [condición] (http://docs.oracle.com/cd/E14072_01/server.112/e10592/conditions.htm), no una función. –

Respuesta

-1

SQL No funciona así. la sentencia where siempre busca una función/columna donde algo es. incluso si la función que funciona todavía tiene que decir la declaración en qué valor desea Verdadero o Falso

No he utilizado Oracle SQL, pero mirando a lo que tienes ahí creo que si usted lo escribe como esto

select * 
    from table t 
    where is_prod = True 

funcionará, si cambia el tipo de Variable en su función a algo así como un Varchar (5) o algo similar.

En realidad, le está pidiendo a esa función que vea varios registros, de modo que cuando lo tenga como lo hace, actúa como una instrucción Select y no como una instrucción where. dará el valor de la función pero no filtrará el lugar. se verá como una columna con valores de true o false.

Cuando se utiliza la función en un comunicado Where así:

SELECT * 
FROM table t 
WHERE is_Prod 

que es como decir:

SELECT * 
FROM table t 
WHERE Column1 

hay que aclarar al WHERE Declaración

SELECT * 
FROM table t 
WHERE Column1 = 'blue' or is_Prod = 'false' 

en C# puede usar un String como booleano, si es nulo, devuelve false

en SQL Server que sale como esta

Column2 IS NULL 

aún necesita un operador

* * Separador

como yo no uso de Oracle he podido probar esta .

http://docs.oracle.com/cd/B14117_01/server.101/b10759/conditions018.htm

REGEXP_LIKE es una declaración similar. entonces usa un operador de comparación.

es probable que pueda escribir una expresión regular en una declaración similar, aunque estoy seguro de que es lenta y monótona, por lo que hicieron una función que lo hace por usted.

en otras palabras, usted todavía tiene que usar el '= whatever' en la función que ha creado.

+2

No, Oracle SQL no tiene un tipo booleano (aunque PL/SQL sí lo hace), por lo que no puede usar una función que devuelva un booleano. Por supuesto, puede simularlo con 0/1, T/F en lugar de un booleano verdadero, pero creo que eso es lo que el OP intenta evitar. –

+0

de cualquier manera que lo escriba, tiene que agregar el = 'algo' – Malachi

+0

Pero el '= 'algo'' es lo que el OP está tratando de eliminar porque no necesita' regexp_like (' 123 ',' 12 ') = VERDADERO o algo así. Ese es el propósito de la pregunta. – kentcdodds

8

Básicamente, Oracle tiene un tipo de datos booleano solo para PLSQL. Entonces, mientras permanezca en plsql puede usarlos pero no en SQL.

De documentation:

Because SQL has no data type equivalent to BOOLEAN, you cannot:

  • Assign a BOOLEAN value to a database table column

  • Select or fetch the value of a database table column into a BOOLEAN variable

  • Use a BOOLEAN value in a SQL statement, SQL function, or PL/SQL function invoked from a SQL statement

Si usted quiere encontrar metadatos acerca de las funciones incorporadas, entonces tal vez this post puede ayudar.

+2

+1 para acceder a la documentación actual. –

Cuestiones relacionadas