CFC Best Practise : Using cfif statements in Where Clause
Hi there
Wondering if anyone can advise on the best route to take for handlings cfcs...
I have a function set up as so
<!--- GRAB SONG INFORMATION --->
<cffunction name="getSong" access="remote" output="false" returntype="query" hint="return song information, filtered by user id">
<!---Optional Artist Name Argument--->
<cfargument name="nameArt" type="string" required="false" hint="artist we want to grab song for">
<!---Filter by user ID--->
<cfargument name="idUsr" type="any" required="false" hint="if provided, filter by user id">
<!---Optional Filter by user name--->
<cfargument name="nameUsr" required="false" type="string" hint="if supplied, filter by user name">
<!---Optional song id argument--->
<cfargument name="idSng" required="false" type="numeric" hint="if supplied, grab information for song with this id">
<!--- grab song from database --->
<cfquery name="song" datasource="#APPLICATION.mx#">
// SELECT WHICHEVER FIELDS NECESARRY
SELECT.....
<!---If user id is supplied--->
<cfif isDefined('ARGUMENTS.idUsr')>
<!---Filter results by user id--->
WHERE s.userId = <cfqueryparam value = '#ARGUMENTS.IdUsr#' cfsqltype='CF_SQL_INTEGER'>
</cfif>
<!---If user name is supplied--->
<cfif isDefined('ARGUMENTS.nameUsr')>
<!---Filter results by user id--->
WHERE s.userId = (SELECT iUserID
FROM users
WHERE name = <cfqueryparam value = '#ARGUMENTS.nameUsr#' cfsqltype='CF_SQL_VARCHAR' maxLength="12">)
</cfif>
<cfif isDefined('ARGUMENTS.idSng')>
WHERE s.iSongID = <cfqueryparam value = '#ARGUMENTS.idSng#' cfsqltype='CF_SQL_INTEGER'>
</cfif>
ORDER BY s.iSongID DESC
</cfquery>
<!---Return query output--->
<cfreturn song>
</cffunction>
Now im wondering, is it best to have multiple cfifs in the same function, filtering data dependant on what arguments are supplied, or is it best to seperate the function into seperate functions with different filters, without the cfifs?
Many thanks
Also keep in mind that some of your logic can be done on the database side instead of the CF side:
SELECT myFieldA, myFieldB
FROM myTable
WHERE myFieldA = CASE WHEN isNULL(@MyDBVar,'') = '' THEN myFieldA ELSE @MyDBVar END
Will filter your results matching the field myFieldA against the value of the variable @MyDBVar (if it is passed in). You can also use conditional logic to make larger changes to your database query depending on the DB you are using.
Similar Messages
-
Using Case Statement in Where Clause
Hello All,
I wish to conditionally use different columns for retrieving unique row. This will be dependent upon a parameter passed to the Function/Procedure.
The SQL framed looks as below:
+select *+
from Test_Table
where column_1 = <some_value>
and case when p_call_location = 'A' then column_2 like '%ABC%'
when p_call_location = 'B' then column_2 Not Like '%ABC%'
when p_call_location = 'C' then column_3 like '%EFG%'
when p_call_location = 'D' then column_3 like '%IJKL%'
END;
However, I am not sure if this works, as I am getting a Missing Right Paranthesis error. Major hinderance is the depedency on multiple columns, which would need to be referred for particular scenario.
Can somebody please help me with an example or a skeleton of how a query should be formed?
Appreciate an early reply!!!HI,
i think this may solve your issue...get back to me if u have any qry's on this.
CREATE TABLE Test_Table
(p_call_location VARCHAR2(10),
COLUMN_1 VARCHAR2(20),
COLUMN_2 VARCHAR2(20),
COLUMN_3 VARCHAR2(20))
INSERT INTO Test_Table VALUES('A','COMNVAL','ABC_PER','XXXX');
INSERT INTO Test_Table VALUES('A','COMNVAL','PER','XXXX');
INSERT INTO Test_Table VALUES('B','COMNVAL','ABC_PER','XXXX');
INSERT INTO Test_Table VALUES('B','COMNVAL','PER','XXXX');
INSERT INTO Test_Table VALUES('C','COMNVAL','ABC_PER','EFG_XXXX');
INSERT INTO Test_Table VALUES('C','COMNVAL','ABC_PER','XXXX');
INSERT INTO Test_Table VALUES('D','COMNVAL','ABC_PER','EFG_XXXX_IJKL');
INSERT INTO Test_Table VALUES('D','COMNVAL','ABC_PER','GGG_XXXX');
SELECT * FROM Test_Table WHERE ROWID IN (
select case when p_call_location = 'A' AND column_2 like '%ABC%' THEN ROWID
when p_call_location = 'B' AND column_2 Not Like '%ABC%' THEN ROWID
when p_call_location = 'C' AND column_3 like '%EFG%' THEN ROWID
when p_call_location = 'D' AND column_3 like '%IJKL%' THEN ROWID
END AS KK
from Test_Table
where column_1 = 'COMNVAL');
even u can use the below qry also
select *
from test_table
where column_1 = 'COMNVAL'
and (case when p_call_location = 'A' and column_2 like '%ABC%' then 'VALID'
when p_call_location = 'B' and column_2 Not Like '%ABC%' then 'VALID'
when p_call_location = 'C' and column_3 like '%EFG%' then 'VALID'
when p_call_location = 'D' and column_3 like '%IJKL%' then 'VALID'
else 'INVALID'
END) = 'VALID';
thanks
prasuna.
Edited by: user13820845 on Feb 21, 2011 10:25 PM -
Case statement in where clause ??
Hello gurus,
Can we use case statements in where clause ?? Any example will be great!
And also i would like to know, besides CASE and DECODE statements, Is there any way we can use IF ELSE statements in SELECT clause or in WHERE clause ?
Thank you!!Hi,
user642297 wrote:
Hoek,
Thanks for the reply
Whatever you return from 'then' should match your criteria.I didnt get this part...can you elaborate this part ?? Thank you!!Remember what a CASE expression does: it returns a single value in one of the SQL data types (or NULL).
You're probably familiar with conditions such as
WHERE col = 1Inthe example above, col could be replaced by any kind of expression: a function call, and operation (such as "d * 24") or a CASE expression, which is exactly what Hoek posted:
where case
when col = 6 then 1
when col = 9 then 1
end = 1;I think what Hoek meant about mnatching was this: since the CASE expression is being compared to a NUMBER, then every THEN clause (as well as the ELSE, if there is one) should return the same data type. You can't have one THEN clause return a NUMBER, and another one in the same CASE expression return a DATE, like this:
where case
when col = 6 then 1
when col = 9 then SYSDATE -- WRONG! Raises ORA-00932: inconsistent datatypes
end = 1;
By the way, it's rare when a CASE expression really helps in a WHERE clause. CASE is great for doing conitional stuff in places where you otherwise can't (in the ORDER BY clause, for example), but the WHERE clause was designed for conditions.
Hoek was just trying to give a simple example. If you really wanted those results, it would be simpler to say:
where col = 6
or col = 9and simpler still to say
where col IN (6, 9) -
How to use CASE stmt in Where clause
Hi,
How to use CASE stmt in WHERE clause?. I need the code. Please send me as early as possible..........Hi,
1004977 wrote:
Hi,
How to use CASE stmt in WHERE clause?. There's no difference between how a CASE expression is used in a WHERE clause, and how it is used in any other clause. CASE ... END always returns a single scalar value, and it can be used almost anywere a single scalar expression (such as a column, a literal, a single-row function, a + operation, ...) can be used.
CASE expressions aren't needed in WHERE clauses very much. The reason CASE expressions are so useful is that they allow you to do IF-THEN-ELSE logic anywhere in SQL. The WHERE clause already allows you to do IF-THEN-ELSE logic, usually in a more convenient way.
I need the code.So do the peple who want t help you. Post a query where you'd like to use a CASE expression in the WHERE clause. Post CREATE TABLE and INSERT statements for any tables used unless they are commonly available, such as scott.emp). Also, post the results you want from that sample data, and explain how you get those resuts from that data.
See the forum FAQ {message:id=9360002}
Please send me as early as possible..........As mentioned bfore, that's rude. It's also self-defeating. Nobody will refuse to help you because you don't appear pushy enough, but some people will refuse to help you if you appear too pushy. -
Using 2 catsearch in where clause
Hi all,
I have problem using 2 catsearch in where clause, am not sure if there is any solution this. i have created a simple test data as below:-
-- Test Code
create table cust_catalog (
id number(16),
firstname varchar2(80),
surname varchar2(80),
birth varchar2(25),
age numeric )
INSERT ALL
INTO cust_catalog VALUES ('1','John','Smith','Glasgow','52')
INTO cust_catalog VALUES ('2','Emaily','Johnson','Aberdeen','55')
INTO cust_catalog VALUES ('3','David','Miles','Leeds','53')
INTO cust_catalog VALUES ('4','Keive','Johnny','London','45')
INTO cust_catalog VALUES ('5','Jenny','Smithy','Norwich','35')
INTO cust_catalog VALUES ('6','Andy','Mil','Aberdeen','63')
INTO cust_catalog VALUES ('7','Andrew','Smith','London','64')
INTO cust_catalog VALUES ('8','John','Smith','London','54')
INTO cust_catalog VALUES ('9','John','Henson','London','56')
INTO cust_catalog VALUES ('10','John','Mil','London','58')
INTO cust_catalog VALUES ('11','Jon','Smith','Glasgow','57')
INTO cust_catalog VALUES ('12','Jen','Smith','Glasgow','60')
INTO cust_catalog VALUES ('13','Chris','Smith','Glasgow','59')
SELECT * FROM DUAL
EXEC CTX_DDL.create_index_set('cust_iset');
EXEC CTX_DDL.CREATE_PREFERENCE ('cust_lexer', 'BASIC_LEXER');
EXEC CTX_DDL.SET_ATTRIBUTE('cust_lexer', 'SKIPJOINS' , ',''."+-()/');
EXEC CTX_DDL.Create_Preference('cust_wildcard_pref', 'BASIC_WORDLIST');
EXEC CTX_DDL.set_attribute('cust_wildcard_pref', 'prefix_index', 'YES');
EXEC CTX_DDL.ADD_INDEX('cust_iset','id');
EXEC CTX_DDL.ADD_INDEX('cust_iset','birth');
EXEC CTX_DDL.ADD_INDEX('cust_iset','age');
CREATE INDEX FIRSTNAME_IDX ON cust_catalog(firstname) INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('index set cust_iset LEXER cust_lexer Wordlist cust_wildcard_pref');
CREATE INDEX SURNAME_IDX ON cust_catalog(surname) INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('index set cust_iset LEXER cust_lexer Wordlist cust_wildcard_pref');
EXEC DBMS_STATS.GATHER_TABLE_STATS('WORKAROUND', 'CUST_CATALOG', cascade=>TRUE);
-- For removing test data
drop table cust_catalog;
EXEC CTX_DDL.DROP_INDEX_SET('cust_iset');
EXEC CTX_DDL.DROP_PREFERENCE('cust_lexer');
EXEC CTX_DDL.DROP_PREFERENCE('cust_wildcard_pref');
DROP INDEX FIRSTNAME_IDX ;
DROP INDEX SURNAME_IDX ;
------- QUESTIONS IN HERE -------------------------------------------------
SELECT * FROM cust_catalog WHERE ctxsys.catsearch (firstname, 'John','age BETWEEN 40 AND 70 AND birth=''Glasgow''')>0
I have no problem running above query
BUT if i add 2 catsearch on both firstname and surname, i have error ~ catsearch does not support function invocation
SELECT * FROM cust_catalog WHERE ctxsys.catsearch (firstname, 'John','age BETWEEN 40 AND 70 AND birth=''Glasgow''')>0 AND
ctxsys.catsearch (surname, 'Smith','age BETWEEN 40 AND 70 AND birth=''Glasgow''')>0
:(The following expands the example to include the birth (as part of the multi_column_datastore) and age (using filter by during index creation and sdata in the query) and show the execution plan. I have provided the script and execution separately.
-- script:
DROP TABLE cust_catalog
EXEC CTX_DDL.DROP_PREFERENCE ('cust_lexer')
EXEC CTX_DDL.DROP_PREFERENCE ('cust_wildcard_pref')
EXEC CTX_DDL.DROP_PREFERENCE ('your_datastore')
EXEC CTX_DDL.DROP_SECTION_GROUP ('your_sec')
CREATE TABLE cust_catalog
(id NUMBER (16),
firstname VARCHAR2 (80),
surname VARCHAR2 (80),
birth VARCHAR2 (25),
age NUMERIC)
INSERT ALL
INTO cust_catalog VALUES (1, 'John', 'Smith', 'Glasgow', 52)
INTO cust_catalog VALUES (2, 'Emaily', 'Johnson', 'Aberdeen', 55)
INTO cust_catalog VALUES (3, 'David', 'Miles', 'Leeds', 53)
INTO cust_catalog VALUES (4, 'Keive', 'Johnny', 'London', 45)
INTO cust_catalog VALUES (5, 'Jenny', 'Smithy', 'Norwich', 35)
INTO cust_catalog VALUES (6, 'Andy', 'Mil', 'Aberdeen', 63)
INTO cust_catalog VALUES (7, 'Andrew', 'Smith', 'London', 64)
INTO cust_catalog VALUES (8, 'John', 'Smith', 'London', 54)
INTO cust_catalog VALUES (9, 'John', 'Henson', 'London', 56)
INTO cust_catalog VALUES (10, 'John', 'Mil', 'London', 58)
INTO cust_catalog VALUES (11, 'Jon', 'Smith', 'Glasgow', 57)
INTO cust_catalog VALUES (12, 'Jen', 'Smith', 'Glasgow', 60)
INTO cust_catalog VALUES (13, 'Chris', 'Smith', 'Glasgow', 59)
SELECT * FROM DUAL
EXEC CTX_DDL.CREATE_PREFERENCE ('cust_lexer', 'BASIC_LEXER')
EXEC CTX_DDL.SET_ATTRIBUTE ('cust_lexer', 'SKIPJOINS' , ',''."+-()/')
EXEC CTX_DDL.Create_Preference ('cust_wildcard_pref', 'BASIC_WORDLIST')
EXEC CTX_DDL.set_attribute ('cust_wildcard_pref', 'prefix_index', 'YES')
EXEC CTX_DDL.CREATE_PREFERENCE ('your_datastore', 'MULTI_COLUMN_DATASTORE')
EXEC CTX_DDL.SET_ATTRIBUTE ('your_datastore', 'COLUMNS', 'firstname, surname, birth')
EXEC CTX_DDL.CREATE_SECTION_GROUP ('your_sec', 'BASIC_SECTION_GROUP')
EXEC CTX_DDL.ADD_FIELD_SECTION ('your_sec', 'firstname', 'firstname', TRUE)
EXEC CTX_DDL.ADD_FIELD_SECTION ('your_sec', 'surname', 'surname', TRUE)
EXEC CTX_DDL.ADD_FIELD_SECTION ('your_sec', 'birth', 'birth', TRUE)
CREATE INDEX context_idx
ON cust_catalog (firstname)
INDEXTYPE IS CTXSYS.CONTEXT
FILTER BY age
PARAMETERS
('DATASTORE your_datastore
SECTION GROUP your_sec
LEXER cust_lexer
WORDLIST cust_wildcard_pref')
COLUMN firstname FORMAT A10
COLUMN surname FORMAT A10
COLUMN birth FORMAT A10
SET AUTOTRACE ON EXPLAIN
SELECT * FROM cust_catalog
WHERE CONTAINS
(firstname,
'(John WITHIN firstname)
AND (Glasgow WITHIN birth)
AND (SDATA (age BETWEEN 40 AND 70))') > 0
SET AUTOTRACE OFF-- execution:
SCOTT@orcl_11gR2> DROP TABLE cust_catalog
2 /
Table dropped.
SCOTT@orcl_11gR2> EXEC CTX_DDL.DROP_PREFERENCE ('cust_lexer')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.DROP_PREFERENCE ('cust_wildcard_pref')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.DROP_PREFERENCE ('your_datastore')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.DROP_SECTION_GROUP ('your_sec')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> CREATE TABLE cust_catalog
2 (id NUMBER (16),
3 firstname VARCHAR2 (80),
4 surname VARCHAR2 (80),
5 birth VARCHAR2 (25),
6 age NUMERIC)
7 /
Table created.
SCOTT@orcl_11gR2> INSERT ALL
2 INTO cust_catalog VALUES (1, 'John', 'Smith', 'Glasgow', 52)
3 INTO cust_catalog VALUES (2, 'Emaily', 'Johnson', 'Aberdeen', 55)
4 INTO cust_catalog VALUES (3, 'David', 'Miles', 'Leeds', 53)
5 INTO cust_catalog VALUES (4, 'Keive', 'Johnny', 'London', 45)
6 INTO cust_catalog VALUES (5, 'Jenny', 'Smithy', 'Norwich', 35)
7 INTO cust_catalog VALUES (6, 'Andy', 'Mil', 'Aberdeen', 63)
8 INTO cust_catalog VALUES (7, 'Andrew', 'Smith', 'London', 64)
9 INTO cust_catalog VALUES (8, 'John', 'Smith', 'London', 54)
10 INTO cust_catalog VALUES (9, 'John', 'Henson', 'London', 56)
11 INTO cust_catalog VALUES (10, 'John', 'Mil', 'London', 58)
12 INTO cust_catalog VALUES (11, 'Jon', 'Smith', 'Glasgow', 57)
13 INTO cust_catalog VALUES (12, 'Jen', 'Smith', 'Glasgow', 60)
14 INTO cust_catalog VALUES (13, 'Chris', 'Smith', 'Glasgow', 59)
15 SELECT * FROM DUAL
16 /
13 rows created.
SCOTT@orcl_11gR2> EXEC CTX_DDL.CREATE_PREFERENCE ('cust_lexer', 'BASIC_LEXER')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.SET_ATTRIBUTE ('cust_lexer', 'SKIPJOINS' , ',''."+-()/')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.Create_Preference ('cust_wildcard_pref', 'BASIC_WORDLIST')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.set_attribute ('cust_wildcard_pref', 'prefix_index', 'YES')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.CREATE_PREFERENCE ('your_datastore', 'MULTI_COLUMN_DATASTORE')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.SET_ATTRIBUTE ('your_datastore', 'COLUMNS', 'firstname, surname, birth')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.CREATE_SECTION_GROUP ('your_sec', 'BASIC_SECTION_GROUP')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.ADD_FIELD_SECTION ('your_sec', 'firstname', 'firstname', TRUE)
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.ADD_FIELD_SECTION ('your_sec', 'surname', 'surname', TRUE)
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC CTX_DDL.ADD_FIELD_SECTION ('your_sec', 'birth', 'birth', TRUE)
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> CREATE INDEX context_idx
2 ON cust_catalog (firstname)
3 INDEXTYPE IS CTXSYS.CONTEXT
4 FILTER BY age
5 PARAMETERS
6 ('DATASTORE your_datastore
7 SECTION GROUP your_sec
8 LEXER cust_lexer
9 WORDLIST cust_wildcard_pref')
10 /
Index created.
SCOTT@orcl_11gR2> COLUMN firstname FORMAT A10
SCOTT@orcl_11gR2> COLUMN surname FORMAT A10
SCOTT@orcl_11gR2> COLUMN birth FORMAT A10
SCOTT@orcl_11gR2> SET AUTOTRACE ON EXPLAIN
SCOTT@orcl_11gR2> SELECT * FROM cust_catalog
2 WHERE CONTAINS
3 (firstname,
4 '(John WITHIN firstname)
5 AND (Glasgow WITHIN birth)
6 AND (SDATA (age BETWEEN 40 AND 70))') > 0
7 /
ID FIRSTNAME SURNAME BIRTH AGE
1 John Smith Glasgow 52
1 row selected.
Execution Plan
Plan hash value: 495863752
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 136 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| CUST_CATALOG | 1 | 136 | 4 (0)| 00:00:01 |
|* 2 | DOMAIN INDEX | CONTEXT_IDX | | | 4 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - access("CTXSYS"."CONTAINS"("FIRSTNAME",'(John WITHIN firstname)
AND (Glasgow WITHIN birth) AND (SDATA (age BETWEEN 40 AND 70))')>0)
Note
- dynamic sampling used for this statement (level=2)
SCOTT@orcl_11gR2> SET AUTOTRACE OFF -
How can we use DECODE function in where clause.
Hi Guys,
I have to use DECODE function in where clause.
like below
select * from tab1,tab2
where a.tab1 = b.tab2
and decode(code, 'a','approved')
in this manner its not accepting?
Can any one help me on this or any other aproach?
Thanks
-LKR>
I am looking for to decode the actual db value something in different for my report.
like if A then Accepted
elseif R then Rejected
elseif D then Denied
these conditions I have to check in where clause.
>
what are you trying to do?
may be you are looking for
select * from tab1,tab2
where a.tab1 = b.tab2
and
(decode(:code, 'A','Accepted') = <table_column>
or
decode(:code, 'R','Rejected') = <table_column>
or
decode(:code, 'D','Denied') = <table_column>
) -
Using CLOB datatypes in WHERE clause
Hi All,
I have a table with two columns as CLOB datatype. I'm using Oracle 8i Enterprise Edition. I can do a query, insert, update and even delete the data in the CLOB field using Oracle's SQL Plus.
What I want is to do a search on those fields.. that is include that field in a WHERE clause. I'm using this datatype to store large number of data.
I'd like to see this query working...
SELECT * FROM MyTable WHERE CLOBFLD LIKE 'Something...';
Now this query doesn't work. It returns: 'Inconsistent datatype' near the word CLOBFLD.
Please Help me out.
Regards,
Gopi
nullI presume you want to query based on the contents of the CLOB, right ? If that is true, then you have to create a text index, using Oracle Context and then use "Contains" in the where clause to query. Hope this helps.
-
How to use Alias Columns in WHERE CLAUSE
Hi ,
I have a query where in there are 2 alias columns, start_date and end_date where in i need to use them in my WHERE clause as start_date < end_date. Please let me know if this is possible. please see the bwlow query
SELECT (GREATEST (MIN (a.start_date_active),
MIN (b.start_date_active),
MIN (c.start_date_active),
d.start_date_active ) start_date ,
LEAST (MAX (NVL (a.end_date_active, b.end_date_active)),
MAX (c.end_date_active),
MAX (b.end_date_active),
NVL (d.end_date_active,'31-DEC-2099')) end_date,
c.terr_id,
a.source_number,
e.resource_id mgr_resource_id,
d.role_relate_id role_relate_id
,g.resource_id
FROM table1 a,
table5 e,
table4 d,
table6 f,
table7 g,
table8 h ,
table2 b,
table3 c,
table9 i
WHERE 1=1
AND b.resource_id = g.resource_id
AND c.terr_id = b.terr_id
AND to_number (c.attribute3) = i.party_id
AND a.source_number = UPPER (e.salesrep_number)
AND d.role_resource_type = 'RS_INDIVIDUAL'
AND e.resource_id = d.role_resource_id
AND d.role_id = f.role_id
AND (a.start_date_active <= b.end_date_active
AND (NVL (a.end_date_active, b.end_date_active) >= b.start_date_active))
AND h.resource_id = a.resource_id
AND UPPER (g.salesrep_number) = h.source_number
GROUP BY a.source_number, c.terr_id, e.resource_id,d.start_date_active,d.end_date_active,d.role_relate_id,g.resource_id
Thanks,
LakshmiI did not understand your query but have you tried using the HAVING clause?
HAVING clause allows you to use a "where" like condition for your groupings.
See http://www.techonthenet.com/sql/having.php for some examples.
Sandeep Gandhi -
How to use alias name in where clause
Hello,
DECODE (item.inv_type,'OT', (DECODE (item.attribute2, 'STONE', 0, xfer.release_quantity1 * xfer.attribute10)
'FG', (xfer.release_quantity1 * xfer.attribute10)
) matl_val
In the above code matl_val is alias name i need to use that one in where clause as
where matl_val > 0
is this possible or anyother way can anyone help me.But the point is as you haven't read the documentation you may miss some valuable points about alias and will soon end with another problem.
>
Specify an alias for the column expression. Oracle Database will use this alias in the column heading of the result set. The AS keyword is optional. The alias effectively renames the select list item for the duration of the query. The alias can be used in the order_by_clause but not other clauses in the query.
>
http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/statements_10002.htm#SQLRF01702 -
Can I use SYSDATE in the WHERE clause to limit the date range of a query
Hi,
Basicaly the subject title(Can I use SYSDATE in the WHERE clause to limit the date range of a query) is my question.
Is this possible and if it is how can I use it. Do I need to join the table to DUAL?
Thanks in advance.
SteliosAs previous poster said, no data is null value, no value. If you want something, you have nvl function to replace null value by an other more significative value in your query.<br>
<br>
Nicolas. -
Use "ListContains' in a WHERE clause
I believe I have a syntax problem and could you some help.
First, I have a field in an Access DB called 'degree" that conatins
a list of numbers. This list can be any combination of the numbers
4 through 32. On my search page I have a selection box in a form to
select a value of the degree to search for. The variable passed
from the form is called "degreeValue". I have a component that lets
me build my WHERE clause using several seach criteria. It functions
perfectly prior to adding the search for "degree". I attempted to
use "ListContains" in the WHERE clause using "degree" as the name
of my list and "degreeValue" as my substring to search for. The
error I get says that "variable degree is undefined". I am
attaching the full code of the compoanent so you can see it. Again,
it works if you take out the subclause build for "degree".I understand what you are saying and in other situations have
done my tables that way. I didn't this time because this is one of
those... "add it later" kind of things. Yes, the field does look
like "1,2,3,4,etc.." The inventory a couple thousand items each
with a number (catno). As you obviously noticed the inventory table
houses most of the data for the items. The "degree" field in the
past was only used to populate a series of checkboxes and was not
searchable, thus a list was used.
With a possibility of 29 values for "degree" and a
possiblility of over 2,000 inventory items you can see a newly
created table might become quite large. It would be nice if I could
use the current structure.
You are absolutely correct saying the design should be
different. Thank you for your quick reply and good information. -
Case statement within where clause
How can i write a case statement within Where clause of SQL statement.
Ex:
If sysdate is less than Dec 31 of 2009 then run the query for 2009 else run the query for 2010.
belwo query is not working. Please let me know how can i write a case statement within where clause.
Select * from table
where
Case
when to_char(sysdate,'yyyymmdd')<=20091231 then tax_year=2009
else tax_year=2010
EndHi,
You can get the results you want like this:
Select *
from table
where tax_year = Case
when to_char(sysdate,'yyyymmdd') <= 20091231
then 2009
else 2010
End
;A CASE expression returns a single value in one of the SQL data types, such as a NUMBER, VARCHAR2 or DATE. There is no boolean type in SQL. -
Is it possible to use LONG columns in WHERE clause or ORDER BY?
Is it possible to use LONG columns in WHERE clause or ORDER BY?
Hi,
LONG data type is deprecated, maybe could you change your column type to LOB ?
Nonetheless below is a workaround which may fit your needs if forced to use LONG.
It uses a function which returns you a CLOB. It allows you to use the converted "LONG" column in a WHERE clause.
Then if you want to order by you have to convert the CLOB to a VARCHAR using DBMS_LOB.SUBSTR.
SQL> CREATE TABLE my_table (id NUMBER, description LONG);
Table created.
SQL> INSERT INTO my_table VALUES (1, 'FIRST LONG');
1 row created.
SQL> INSERT INTO my_table VALUES (2, 'ANOTHER LONG');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TYPE my_type_row AS OBJECT (id INTEGER, description CLOB);
2 /
Type created.
SQL> CREATE TYPE my_type_table AS TABLE OF my_type_row;
2 /
Type created.
SQL> CREATE OR REPLACE FUNCTION get_my_long
2 RETURN my_type_table
3 PIPELINED
4 AS
5 v_tab my_type_table := my_type_table ();
6 BEGIN
7 FOR cur IN (SELECT id, description FROM my_table)
8 LOOP
9 PIPE ROW (my_type_row (cur.id, cur.description));
10 END LOOP;
11 RETURN;
12 END;
13 /
Function created.
SQL> SELECT
2 id,
3 description
4 FROM
5 TABLE (get_my_long ())
6 WHERE
7 description LIKE '%LONG'
8 ORDER BY
9 DBMS_LOB.SUBSTR(description);
ID DESCRIPTION
2 ANOTHER LONG
1 FIRST LONG
SQL> SELECT
2 id,
3 description
4 FROM
5 TABLE (get_my_long ())
6 WHERE
7 description LIKE 'FI%';
ID DESCRIPTION
1 FIRST LONG
SQL>Kind regards,
Ludovic -
How to use a case statement in where clause
Hi All,
I have a requirement which is to bring all the claims that are created in the last month.So, i wrote a query something like this
select * from claims
where
(Month(ClaimOpenDate) = Month(Getdate())-1 and year(claimopendate) = year(getDate()))
which would give me any new claims created in last month of current year, but this condition fails if we are in the first month of a new year( lets say if we are in 2016 jan then month(getdate())-1 would be 0 and year(getdate()) would be 2016 so we dont
find any records where year is 2016 and month is 0 for claimopen).
So, i would like to use a case statament or something which can help me get around this one.
Can someone please help me with any suggestions?
ThanksHi Jason,
Thanks a lot for your help. This is what exactly i am looking for but i just gave a sample query above below is my original query
select
row_number() over (order by [ClaimNumber]) as DataElementName
,c.PolicyNumber as PolicyNum
, c.FirstName as CustNameF
,c.LastName as CustNameL
,c.PolicyForm as PolType
,'Homesite' as Company
,[ClaimNumber] as ClaimNum
,E.office as Ofc
,e.Supervisior_FullName as Team
, RIGHT(e.adjuster_Name ,LEN(e.adjuster_Name)- charindex(',' ,e.adjuster_Name)) as FORepF
, case when charindex(',' ,e.adjuster_Name) <> 0 then left(e.adjuster_Name,charindex(',' ,e.adjuster_Name)-1) else e.adjuster_Name end as FORepL
,e.AdjusterID as RepC -- not sure
,CONVERT ( varchar,c.LossDate ,101) as DOL
,convert (varchar,c.ClaimOpenDate,101) as DOR
,rtrim(c.Loss_State) as LossSt
,c.Loss_ZipCode as LossZIP
,c.Loss_City as LossCity
,c.LossType as FOL
,'' as PR
,'' as PRNum
,1 as FeaNum
,'HO' as FeaType
,case when rtrim(c.claimStatus)= 'Closed' then 'Closed' else 'Open' end as FeaStat
,'' as FeaOpen
,'' as FeaClosed
,s.PaymentIndemnityAmount as PaidAmt
,s.ReserveIndemnityAmount as Reserve
,'' as Sub
,'' as Sal
,'' as FeatOwnOfc
,e.Supervisior_FullName as FeatOwnTeam
,RIGHT(e.adjuster_Name ,LEN(e.adjuster_Name)- charindex(',' ,e.adjuster_Name)) as FeatOwnRepF
,case when charindex(',' ,e.adjuster_Name) <> 0 then left(e.adjuster_Name,charindex(',' ,e.adjuster_Name)-1) else e.adjuster_Name end as FeatOwnRepL
,e.AdjusterID as FeatOwnRepCode
,NULL AS Description --not sure
from [Stg].[HS_DW_RV_Claims] c
inner join [dbo].[Claims_Primary_Adjuster] a on a.CLAIM_NUMBER = c.ClaimNumber
inner join [dbo].[vw_Adjuster] e on e.adjuster_Name = a.primary_ADJUSTER
left outer join [Stg].[HS_DW_LossClaimSummary] s on c.ClaimKey=s.ClaimKey
where c.LoadSource = 'CMS'
and
(s.PaymentIndemnityAmount <>0 or s.PaymentExpenseAmount <>0)
and
ClaimOpenDate BETWEEN DATEADD(mm, DATEDIFF(mm, 0, CURRENT_TIMESTAMP) -1, 0) AND DATEADD(mm, DATEDIFF(mm, 0, CURRENT_TIMESTAMP), 0)
UNION ALL
select
row_number() over (order by [ClaimNumber]) as DataElementName
,c.PolicyNumber as PolicyNum
, c.FirstName as CustNameF
,c.LastName as CustNameL
,c.PolicyForm as PolType
,'Homesite' as Company
,[ClaimNumber] as ClaimNum
,E.office as Ofc
,e.Supervisior_FullName as Team
, RIGHT(e.adjuster_Name ,LEN(e.adjuster_Name)- charindex(',' ,e.adjuster_Name)) as FORepF
, case when charindex(',' ,e.adjuster_Name) <> 0 then left(e.adjuster_Name,charindex(',' ,e.adjuster_Name)-1) else e.adjuster_Name end as FORepL
,e.AdjusterID as RepC -- not sure
,CONVERT ( varchar,c.LossDate ,101) as DOL
,convert (varchar,c.ClaimOpenDate,101) as DOR
,rtrim(c.Loss_State) as LossSt
,c.Loss_ZipCode as LossZIP
,c.Loss_City as LossCity
,c.LossType as FOL
,'' as PR
,'' as PRNum
,1 as FeaNum
,'HO' as FeaType
,case when rtrim(c.claimStatus)= 'Closed' then 'Closed' else 'Open' end as FeaStat
,'' as FeaOpen
,'' as FeaClosed
,s.PaymentIndemnityAmount as PaidAmt
,s.ReserveIndemnityAmount as Reserve
,'' as Sub
,'' as Sal
,'' as FeatOwnOfc
,e.Supervisior_FullName as FeatOwnTeam
,RIGHT(e.adjuster_Name ,LEN(e.adjuster_Name)- charindex(',' ,e.adjuster_Name)) as FeatOwnRepF
,case when charindex(',' ,e.adjuster_Name) <> 0 then left(e.adjuster_Name,charindex(',' ,e.adjuster_Name)-1) else e.adjuster_Name end as FeatOwnRepL
,e.AdjusterID as FeatOwnRepCode
,DESCRIPTION --not sure
from Stg.IG_Document D
inner join [Stg].[HS_DW_RV_Claims] c on D.PARENTREF = C.ClaimNumber
inner join [dbo].[Claims_Primary_Adjuster] a on a.CLAIM_NUMBER = c.ClaimNumber
inner join [dbo].[vw_Adjuster] e on e.adjuster_Name = a.primary_ADJUSTER
left outer join [Stg].[HS_DW_LossClaimSummary] s on c.ClaimKey=s.ClaimKey
where c.LoadSource = 'CMS'
and
DESCRIPTION like '%Denial Letter%'
and
ClaimOpenDate BETWEEN DATEADD(mm, DATEDIFF(mm, 0, CURRENT_TIMESTAMP) -1, 0) AND DATEADD(mm, DATEDIFF(mm, 0, CURRENT_TIMESTAMP), 0)
So if i use your logic in the end for both the where clauses its been more than 10 minutes and the query is still running however if i use my old method it doesnt even take a second. Looks like its affecting the execution plan. Any suggestions to get around
this one please?
Thanks -
Using regexp_instr in a where clause - invalid relational operator
Whey I try to run this query in TOAD I get an ORA-00920: invalid relational operator error. It's part of a 10g stored procedure. When I highlight it and run it it prompts me for the missing values and then the error pops up. The AND in line 4 is highlighted.
select CRIME_CLASSIFICATION_ID, crime_type, nvl(count(CRIME_CLASSIFICATION_ID),0) as CRIMECNT
From vaps.vw_offenses
where regexp_instr(valoc,to_char(location_id))
AND ( fromdate is null or
offense_date between to_date(fromdate, 'mm/dd/yyyy') AND to_date(todate,'mm/dd/yyyy')
group by crime_classification_id, crime_typeHi,
Review what REGEXP_INSTR does: it returns a NUMBER.
Your WHERE clause couldn't make any sense if you used any other kind of NUMBER expression in that place, e.g. a NUMBER literal such as 12:
select CRIME_CLASSIFICATION_ID, crime_type, nvl(count(CRIME_CLASSIFICATION_ID),0) as CRIMECNT
From vaps.vw_offenses
where 12 -- This is obviously wrong
AND ( fromdate is null or
offense_date between to_date(fromdate, 'mm/dd/yyyy') AND to_date(todate,'mm/dd/yyyy')
group by crime_classification_id, crime_type
It's not going to work any better with a function (like REGEXP_INSTR) that returns a NUMBER.
How can you fix it? That depends on what you want to do. Why are you calling REGEXP_INSTR? What is that condition checking?
Whenever you have a problem, please post a little sample data (CREATE TABLE and INSERT statements, relevant columns only) from all tables involved, so that the people who want to help you can re-create the problem and test their ideas.
Also post the results you want from that data, and an explanation of how you get those results from that data, with specific examples.
Always say which version of Oracle you're using (for example, 11.2.0.2.0).
See the forum FAQ: https://forums.oracle.com/message/9362002
Maybe you are looking for
-
POI, HWPFDocument, background color of MS-Word document part
I'm trying to make doc2html translator for my web-project. I can get a color of text-parts in document (RunCharacters), but i don't know how to get its background color. Can't find any information about it for HWPF. pls help Edited by: refref on Dec
-
How do I remove "Toast Lite" window at Startup?
When I start up my computer, an iMac G4, it always shows first, in the Finder window, the application ToastLite window, prompting me to insert a CD for copying music or data. I don't know how this happened; I must have asked for it at some point, but
-
Office computer attacked by malware
Just posting what I noticed when my office Mac Desktop Pro was attacked today. I had not visited what I would call questionable sites. I only visit the same regular sites which I have for years. Some of my web traffic was to corporate sites which inc
-
why cant i connect to wifi since i started to download ios7. I cant pair my bluetooth in my auto and I cant hook up to wifi on my iphone
-
Hi, Could please help me with an issue in NW Scheduler. I have followed the standard SAP documentation on NW Scheduler. I have created one J2EE project with MDB bean. I have added tc/je/scheduler/api as dependent. At the time of deployment it shows