Splitting data separated by commas
Hi friends,
I have a few million records that must be formatted as data and need your help with this.
Actual data in the csv file:
«30375516451 ',' June 3, 2013 23:31:33 ","June 4, 13"," Tag #: 2490544Sharjah - White 33708 ", 'Al Garhoud bridge nine', 'Abu Dhabi', '4.00»»'
Value using request, separated by commas:
Select
Replace (replace (replace (replace (test_value,'"', null"), chr (13), null), chr (160), null), chr (10), null) "test_value"
of the test
where to_number (length (test_value) - length (replace(test_value,',',''))) in (3.6);
Output:
30375516451, 03-Jun-2013 23:31:33, 4 June 13, Tag #: 2490565Sharjah - white 33708, new Al Garhoud bridge Abu Dhabi, 4.00
Need to change a part with highest result of the query to make it entirely comma separated:
Tag #: 2490565Sharjah - White 33708,.
Output:
2490565, Sharjah, 33708 white,-remove the space before the comma: white 33708,.
Power required:
30375516451, 03-Jun-2013 23:31:33, June 4, 13, 2490544, Sharjah, white 33708, Al Garhoud new bridge, Abu Dhabi, 4.00
Sample data:
CREATE TABLE TEST (TEST_VALUE VARCHAR2 (4000));
INSERT INTO TEST VALUES (' "30375516451","June 3, 2013 23:31:33", "June 4, 13","Tag #: 2490565Sharjah - White 33708", "Al Garhoud bridge nine", "Abu Dhabi", "4.00" ' ");
Thank you
with the trial as)
Select "" 30375516451 ',' June 3, 2013 23:31:33 ","June 4, 13"," Tag #: 2490544Sharjah - 33708 white ', 'Al Garhoud New Bridge', 'Abu Dhabi', '4.00' ' test_value»
of the double
)
Select regexp_replace)
regexp_replace)
test_value,
'( *")| [' || Chr (13) | Chr (160) | Chr (10) | ']',
NULL,
1,
0,
« n »
),
'Tag #:(\d+)(.+) - ([^,]+)',
'\1,\2,\3 '.
) test_value
of the test
/
TEST_VALUE
--------------------------------------------------------------------------------------------------------------
30375516451, 03-Jun-2013 23:31:33, 04-Jun-13, 2490544, Sharjah, White 33708, new Al Garhoud bridge Abu Dhabi, 4.00
SQL >
SY.
Tags: Database
Similar Questions
-
How to split string separated by commas and pass to the clause of the select statement
Referring to article How to divide string separated by commas, then pass to clause of a select statement, tquery that there the following plan:
Query1:
select * from emp where ename in ( select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null );
Base1:
Plan hash value: 4242290184 -------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 133 | 7 (29)| 00:00:01 | |* 1 | HASH JOIN | | 1 | 133 | 7 (29)| 00:00:01 | | 2 | VIEW | VW_NSO_1 | 1 | 46 | 3 (34)| 00:00:01 | | 3 | HASH UNIQUE | | 1 | | 3 (34)| 00:00:01 | |* 4 | CONNECT BY WITHOUT FILTERING| | | | | | | 5 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 | | 6 | TABLE ACCESS FULL | EMP | 14 | 1218 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("ENAME"="$nso_col_1") 4 - filter( REGEXP_SUBSTR ('SMITH,ALLEN,WARD,JONES','[^,]+',1,LEVEL) IS NOT NULL)
However, the following query generates the plan I want:
Query2:
select * from emp where ename in ('SMITH','ALLEN','WARD','JONES');
Plan2:
Plan hash value: 3956160932 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 348 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMP | 4 | 348 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("ENAME"='ALLEN' OR "ENAME"='JONES' OR "ENAME"='SMITH' OR "ENAME"='WARD')
Can I change the query1 query for plan2?
As Juliet was mentioned in the first SQL that you generate from the ENAME list that you must pass in the IN clause when executing. But in the second SQL, it passed as a static value. So first SQL must do more work. So you see a different execution plan.
But this is a work around to get what you are looking for. But I can't say it's a foolproof method. But anyway here you go.
SQL > var ename_list varchar2 (100)
SQL > exec: ename_list: = 'SMITH, ALLEN, WARD, JONES ';PL/SQL procedure successfully completed.
SQL > select *.
2 of PEM
where the 3 «,» | : ename_list | ',' like '%', | Ename | ',%';EMPNO, ENAME, JOB HIREDATE DEPTNO ID COM SAL MGR
---------- ------ --------- ---------- --------- ---------- ---------- ---------- ----------
7369 SMITH COMMITTED 7902 2975 2 APRIL 81 0 20
7499 ALLEN 7698 1600 20 FEBRUARY SALESMAN 81 300 30
7521 WARD 7698 1250 22 FEBRUARY SALESMAN 81 500 30
7566 JONES MANAGER 7839 2975 2 APRIL 81 0 20SQL > select * from table (dbms_xplan.display_cursor);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------
SQL_ID, 848zhvbvgf7d6, number of children 0
-------------------------------------
Select * from emp where «,» | : ename_list | ',' like '%', | Ename
|| ',%'Hash value of plan: 2872589290
--------------------------------------------------------------------------
| ID | Operation | Name | Lines | Bytes | Cost (% CPU). Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100) | |
|* 1 | TABLE ACCESS FULL | EMP | 1. 38. 2 (0) | 00:00:01 |
--------------------------------------------------------------------------Information of predicates (identified by the operation identity card):
---------------------------------------------------1 - filter(','||:ENAME_LIST||',' LIKE '%,'||") ENAME "|", %')
19 selected lines.
SQL >
-
split values separated by comma in oracle 9i
Hello
I have a line with values id1, id2
I need to split in order to put in a query.
for ex: select * from table where id in (select id from table2)
ID - id1, id2
I tried REGEXP_SUBSTR but it will not work on 9i
Please suggest
Thanks in advance
I think that following script can help you:
SELECT CUT (SUBSTR (txt
, INSTR (txt, "," 1, level) + 1
, INSTR (txt, "," 1, level + 1)-INSTR (txt, "," 1, level)-1
)
)
AS token
FROM (SELECT ',' |: in_string |) ',' AS double txt)
CONNECT BY level<=>=>
This script works on 9i.
in your case
SELECT *.
TABLE
WHERE id IN
(SELECT to_number (TRIM (SUBSTR (txt, INSTR (txt, ',', 1, level) + 1, INSTR (txt, "," 1, level + 1)-INSTR (txt, "," 1, level)-1))) AS token)
FROM (SELECT ',' |) ID | ',' AS a txt FROM table2)
CONNECT BY level<=>=>
-
passing values separated by commas of a single parameter
Hi experts,
I am writing a report where I need to pass the values (dates) separated by commas for one parameter in the query.
parameter passing is 19810928, 19830112
to do this, I wrote like this
WITH AS's Data1
(SELECT TRIM (SUBSTR (txt,
INSTR (txt, "," 1, LEVEL) + 1.
INSTR (txt, "," 1, LEVEL + 1)
-INSTR (txt, "," 1, LEVEL)
-1
)
) Token.
FROM (SELECT ',' |: txt |) ',' txt
THE DOUBLE)
CONNECTION OF LEVEL < = LENGTH (: txt)-LENGTH (REPLACE (: txt, ",", ")) + 1);
Select ename, sal, deptno, job, hiredate
WCP
where hiredate between (19810928) and (19830112)
above it is argued IN the list
can you help me please
Published by: mbb774 on May 10, 2013 16:07mbb774 wrote:
Sorry, could not help me.Well, she would have done if you'd read and understood it. but it doesn't matter.
SQL> with params as (select '19810928,19830112' as p from dual) 2 -- 3 -- end of simulated parameters 4 -- 5 select ename, deptno, sal, job, hiredate 6 from emp 7 ,(select regexp_substr(p,'[^,]+',1,1) as start_date 8 ,regexp_substr(p,'[^,]+',1,2) as end_date 9 from params) p 10 where hiredate between to_date(p.start_date,'YYYYMMDD') and to_date(p.end_date,'YYYYMMDD') 11 / ENAME DEPTNO SAL JOB HIREDATE ---------- ---------- ---------- --------- -------------------- MARTIN 30 1250 SALESMAN 28-SEP-1981 00:00:00 KING 10 5000 PRESIDENT 17-NOV-1981 00:00:00 JAMES 30 950 CLERK 03-DEC-1981 00:00:00 FORD 20 3000 ANALYST 03-DEC-1981 00:00:00 MILLER 10 1300 CLERK 23-JAN-1982 00:00:00 SQL>
-
Result may contain the unique string or separated by commas must split into lines
Hi all... I searched through the forums and found a lot on separation with commas in lines; Although I'm fighting apply to my situation. I have data that looks at the below where I need to divide a value in several lines if she should be, but the same field in the table may also contain a string which should not be separated (indicated by the field 'Array' be 0 or 1)...
I looked through several of the connect_by on the forum posts, and I've not met one that divides a field if it should be, but not if it is not... maybe missed it because there are a lot of these requests on the forum!WITH t AS (SELECT 1 as array, '"Banana", "Apple", "Pear"' as str FROM dual union all SELECT 0, 'Fruit is delicious' FROM dual union all SELECT 0, 'So are vegetables' FROM dual union all SELECT 1, '"Bean", "Carrot", "Broccoli"' FROM dual union all SELECT 1, '"Apple", "Banana"' FROM dual)
If you are feeling more ambitious - the ultimate goal is to count the number of times where an answer appears in a table - view up to the last part of the data contain 'Apple', 'Banana'... the result are:
I can always sort more later from the other fields in the table - but the result above would be my ultimate goal!RESULT ---------- Banana 2 Apple 2 Pear 1 Bean 1 Carrot 1 Broccoli 1 Fruit is delicious So are vegetables
Any help is always appreciated. Thank you! 31%
-
Display data in the form of values separated by commas - need help
Hi all
I have some data formatted in the way below. The ID of the drug are the primary keys of the table and the first 9 digits in the drug ID are the same. They can be separated based on the last two digits.
Type of drug drug ID
00603107554 respiratory
00603107556 cough and cold
Antitussive-00603107558
I want that data to be formatted as
Type of drug drug ID
006031075 respiratory, cough and colds, Antitussive
I want to cut the last two characters, and format data. And the types must be displayed in the form of values separated by commas. Can someone help me?
Thanks in advance
RambeauWITH t AS (SELECT '00603107554' Drug_ID, 'Respiratory' Drug_Type FROM DUAL UNION SELECT '00603107556', 'Cough and Cold' FROM DUAL UNION SELECT '00603107558', 'Antitussive' FROM DUAL) SELECT Drug_id, SUBSTR (SYS_CONNECT_BY_PATH (Drug_Type, ','), 2) Drug_Types FROM (SELECT SUBSTR (drug_id, 1, LENGTH (drug_id) - 2) drug_id, Drug_Type, ROW_NUMBER () OVER (PARTITION BY SUBSTR (drug_id, 1, LENGTH (drug_id) - 2) ORDER BY Drug_Type) rn FROM t) WHERE CONNECT_BY_ISLEAF = 1 START WITH rn = 1 CONNECT BY PRIOR rn = rn - 1 AND PRIOR drug_id = drug_id
DRUG_ID DRUG_TYPES 006031075 Antitussive,Cough and Cold,Respiratory
just a note, I wonder if blushadow could consider adding techniques agg string to its very useful faq section because it seems a good
request.Published by: pollywog on April 14, 2011 06:42
Published by: pollywog on April 14, 2011 06:43
-
Print data with Format separated by commas.
Hello
I need to establish a rapport with the values in column format, separated by commas. I use > > express edition of oracle 11g
Table used names and customer number, he participated in the interview, it is stored in the format below.
my requirement for the report is shown belowemp_name client_name
JAMES HAS
JAMES B
JAMES C
ALEX HAS
ALEX D
SCOTT B
SCOTT C
please advise me is there any function that converts and print format separated by commas.emp_name count (client_name) client_name
JAMES 3 A, B, C
ALEX 2A, D
2 B, C SCOTT
Thank you
SudhirTry this...
/ * code deleted after suggested by BluShadow * /.
I'll post other methods of String-aggregation...
Try this...select emp_name, count(client_name) cnt, rtrim(XMLAGG(xmlelement(e, client_name||',')).extract('//text()'),',') from xx group by emp_name order by cnt desc;
For versions > 11g Release 2
select emp_name, count(*) cnt, LISTAGG(client_name,',') WITHIN GROUP(ORDER BY NULL) from xx group by emp_name;
Published by: Vanessa B on 7 December 2012 18:50
-adding code -
How to recover the vales separated by commas in the same column in Oracle SQL
Dear members
Please give me the solution for the below question
Oracle table
Ename product
A 1,2,3
B 1,2,3
Product column has data like this only separated by commas
Output should be like this.
Ename, product
A 1
A 2
A 3
B 1
B 2
B 3
Can we get the output above using just Oracle SQL select statement?
I tried in Google I got an answer in SQL server, there is something called "Cross apply split" function, I'm not sure in Oracle.Welcome to the forum.
Here is another interesting site, with lots of useful examples:
http://asktom.Oracle.com/pls/Apex/f?p=100:11:0:P11_QUESTION_ID:2189860818012 #2654179200346949517Also, be sure to read the SQL and PL/SQL FAQ:
http://forums.Oracle.com/forums/Ann.jspa?annID=1535 -
Written for several digital lines separated by commas
Hello people,
I use a USB-6009 box and want to write several digital lines created in the style, separated by commas:
error = DAQmxCreateDOChan(taskSelHead,"dev3/port0/line0,dev3/port0/line6","",DAQmx_Val_ChanPerLine);
When I try to write in this channel I do
uInt8 data [8] = {d1, 0, 0, 0, 0, 0, d2, 0}; with d1 and d2 that represents 0 or 1, which bits I want to get written
int error = DAQmxWriteDigitalLines (taskSelectFilter, 1, 1, 10, DAQmx_Val_GroupByChannel, data, NULL, NULL);
The result is, this only $line0 is updated, lin6 rest 0.
I also tried DAQmxWriteDigitalU8 with the same effect.
Can anyone help?
Thanks in advance,
Michael
Hi Michael,
you have defined two dig.out channels in your task: line 0 and line 6. So, when you write an array of string values, d1 Gets the mapping to your line 0 straight - but line 6 still receives a zero!
Have you tried to set data uInt8 [2] = {d1, d2}?
Best regards
Sebastian -
Value separated by commas in a table column to get each field separtely?
Hello
I have the table that a column has values separated by commas in it. This table is populated using SQL LOADER, which is staging table.
I need to retrieve the records of these values separated by commas.
format of. CSV file is as -
A separate file of pipes.
DHCP-1-1-1. WNLB-CMTS-01-1,WNLB-CMTS-02-2|
DHCP-1-1-2. WNLB-CMTS-03-3,WNLB-CMTS-04-4,WNLB-CMTS-05-5|
DHCP-1-1-3. WNLB-CMTS-01-1.
DHCP-1-1-4. WNLB-CMTS-05-8,WNLB-CMTS-05-6,WNLB-CMTS-05-0,WNLB-CMTS-03-3|
DHCP-1-1-5 | WNLB-CMTS-02-2,WNLB-CMTS-04-4,WNLB-CMTS-05-7|
CREATE TABLE link_data (dhcp_token VARCHAR2 (30), cmts_to_add VARCHAR2 (200), cmts_to_remove VARCHAR2 (200));
insert into link_data values ('dhcp-1-1-1','wnlb-cmts-01-1,wnlb-cmts-02-2',null);
insert into link_data values ('dhcp-1-1-2','wnlb-cmts-03-3,wnlb-cmts-04-4,wnlb-cmts-05-5',null);
insert into link_data values ('dhcp-1-1-3','wnlb-cmts-01-1',null);
insert into link_data values ('dhcp-1-1-4','wnlb-cmts-05-8,wnlb-cmts-05-6,wnlb-cmts-05-0,wnlb-cmts-03-3',null);
insert into link_data values ('dhcp-1-1-5','wnlb-cmts-02-2,wnlb-cmts-04-4,wnlb-cmts-05-7',null);
Here the cmts_to_add column has comma separted
I need values such as -.
> for wnlb-cmts-01-1,wnlb-cmts-02-2 > > wnlb-CMTS-01-1
> > wnlb-CMTS-02-2
> for wnlb-cmts-03-3,wnlb-cmts-04-4,wnlb-cmts-05-5 > > wnlb-CMTS-03-3
> > wnlb-CMTS-04-4
> > wnlb-CMTS-05-5
And so on...
I do this because it's the staging table and I load data into the main tables using this table.
This second field contain different values as the simple comma-delimited string.
I need to write a PLSQL block to insert into the main table after checking as if dhcp-1-1-1 and wnlb-CMTS-01-1 is present in the main table so not to introduce other insert a new record.
To meet this requirement, I need to get the distinct value of the cmts_to_add column to insert into DB.
the value will be inserted as dhcp-1-1-1_TO_wnlb-cmts-01-1 and dhcp-1-1-1_TO_wnlb-cmts-02-2 for the first row of the array of link_data.
The process will also be same for the rest of the lines.
I use the function substrt and instr for this problem, but its does not work.
declare
cursor c_link is select * from link_data.
l_rec_link link_data % rowtype;
l_dhcp varchar2 (30);
l_cmts varchar2 (20000);
l_cmts_1 varchar2 (32000);
Start
Open c_link;
loop
extract the c_link in l_rec_link;
l_cmts: = l_rec_link.cmts_to_add;
loop
l_cmts_1: = substr (l_cmts, 1, instr(l_cmts,',')-1);
dbms_output.put_line (l_cmts_1);
end loop;
dbms_output.put_line(l_dhcp||) e '|| l_cmts);
When the output c_link % notfound;
end loop;
exception
while others then
Dbms_output.put_line ('ERROR' |) SQLERRM);
end;
Its a peusdo code I write, but it also gives me the wrong answer it gives me error ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes
I am using-
Oracle Database 11 g Enterprise Edition Release 11.2.0.1.0 - 64 bit Production
Please tell me if my problem isn't clear!
Hello
little 'trick': Add a comma at the end of the chain... So it's easier to deal with the fact that there are zero, one, or N components...
CREATE TABLE link_data (dhcp_token VARCHAR2 (30), cmts_to_add VARCHAR2 (200), cmts_to_remove VARCHAR2 (200));
insert into link_data values ('dhcp-1-1-1','wnlb-cmts-01-1,wnlb-cmts-02-2',null);
insert into link_data values ('dhcp-1-1-2','wnlb-cmts-03-3,wnlb-cmts-04-4,wnlb-cmts-05-5',null);
insert into link_data values ('dhcp-1-1-3','wnlb-cmts-01-1',null);
insert into link_data values ('dhcp-1-1-4','wnlb-cmts-05-8,wnlb-cmts-05-6,wnlb-cmts-05-0,wnlb-cmts-03-3',null);
insert into link_data values ('dhcp-1-1-5','wnlb-cmts-02-2,wnlb-cmts-04-4,wnlb-cmts-05-7',null);
COMMIT;SET SERVEROUT ON
DECLARE
l_cmts VARCHAR2 (200 CHAR);
l_cmts_1 VARCHAR2 (200 CHAR);
BEGIN
FOR r IN (SELECT dhcp_token, cmts_to_add |) ',' cmts
OF link_data
)
LOOP
l_cmts: = r.cmts;
l_cmts_1: = SUBSTR (l_cmts, 1, INSTR (l_cmts, ",") - 1);
While l_cmts_1 IS NOT NULL
LOOP
DBMS_OUTPUT. Put_line (r.dhcp_token |) '|' || l_cmts_1);
l_cmts: = SUBSTR (l_cmts, INSTR (l_cmts, ",") + 1);
l_cmts_1: = SUBSTR (l_cmts, 1, INSTR (l_cmts, ",") - 1);
END LOOP;
END LOOP;
END;
/
DHCP-1-1-1. WNLB-CMTS-01-1
DHCP-1-1-1. WNLB-CMTS-02-2
DHCP-1-1-2. WNLB-CMTS-03-3
DHCP-1-1-2. WNLB-CMTS-04-4
DHCP-1-1-2. WNLB-CMTS-05-5
DHCP-1-1-3. WNLB-CMTS-01-1
DHCP-1-1-4. WNLB-CMTS-05-8
DHCP-1-1-4. WNLB-CMTS-05-6
DHCP-1-1-4. WNLB-CMTS-05-0
DHCP-1-1-4. WNLB-CMTS-03-3
DHCP-1-1-5 | WNLB-CMTS-02-2
DHCP-1-1-5 | WNLB-CMTS-04-4
DHCP-1-1-5 | WNLB-CMTS-05-7Best regards
Bruno Vroman.
-
Hello
I have 3 tables with the following structure.
create table a_os_lang_stls
(ID NUMBER )
SWB_NUMBER VARCHAR2 (30),
Pc_NUMBER VARCHAR2 (30),
PC_FLAG TANK (1),
INSTALLATION_ord NUMBER ,
SP_OR_LATER_VSN TANK (1),
Platform VARCHAR2 (4000),
OS VARCHAR2 (4000),
LANG VARCHAR2 (4000),
LOSS_OF_FUNC_REASON_TXT VARCHAR2 (4000),
CREATION_DATE DATE ,
MODIFIED_DATE DATE ,
CREATED_BY VARCHAR2 (100 BYTE),
MODIFIED_BY VARCHAR2 (100 BYTE)
);
Insert in a_os_lang_stls
values (1 'SWB1' 'SWB0','P',1 of ','11118,14,16,234,124' '12,26,17,24,35''34,28,45,67,123,95',USER, NULL, NULL, NULL, SYSDATE);
Insert in a_os_lang_stls
values (2,'SWB1' 'SWB2','P',2 of ','111,20,14,16,124''11,26,18,24,35''35,27,42,67,123,95', SYSDATE, NULL, NULL, NULL, USER);
insert into a_os_lang_stls
values (3,'SWB1','SWB3','C', 1,'','11118,14,16,234,124','12,26,17,24,35',' 35,27,42,67,123,95', SYSDATE, NULL, NULL, NULL, USER);
insert into a_os_lang_stls
values (4,'SWB1','SWB4','C', 2,'','111,20,14,16,124','11,26,18,24,35'' 34,28,45,67,123,95, SYSDATE, NULL, NULL, NULL, USER)
CREATE TABLE os_dtls
(
OSCODE VARCHAR2 (10 BYTE),
ID NUMBER DEFAULT NULL,
AG_OSCODE VARCHAR2 (250 BYTE),
);
insert into os_dtls
values ('HUX', 12, 'HP UNIX');
insert into os_dtls
values('SUX',26,'SOLARIS');
insert into os_dtls
values ('LUX', 17, 'LINUX');
CREATE TABLE lang_dtls
(
LANGCD TANK (2 BYTE),
LANGNAME VARCHAR2 (255 BYTE),
ID NUMBER DEFAULT 1 NOT NULL
);
insert into lang_dtls
values ('ENG', 'ENGLISH UK', 35);
insert into lang_dtls
values ('UEG', 'USA ENGLISH', 27);
insert into lang_dtls
values('FR','FRENCH',45);
Information on the database:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64 bit Production
PL/SQL version 11.1.0.7.0 - Production
Production base 11.1.0.7.0
AMT for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production
I have to write a procedure like this
procedure os_lang_info (P_SB_NO IN varchar2, p_pcur sys_refcursor, p_ccur, sys_refcursor );
The requirement is to get the details for a given swb_no where pc_flag is P or C pass like 2 different sys_refcursor. But the value of column of bones and lang I need to map to the os_dtls and lang_dtls tables to get the ag_oscode and langname respectively for the corresponding id then through sys_refcursor.
So sys_refcursor structure will be
Open the p_pcur for
Select * from a_os_lang_stls
where swb_number = p_sb_no
and PC_FLAG = 'P' ;
so the output will resemble the following
1 , « SWB1 » , « SWB0 » , 'P' , 1 , 'S' , '11118,14,16,234,124' , «HP UNIX,SOLARIS,LINUX,... « , "UK ENGLISH,US ENGLISH,FRENCH,...» ', NULL, NULL, NULL, USER, SYSDATE
I must get the id separated by commas of column bone and lang and map to the corresponding table to get the names separated by commas of the bones and langs and pass it as a component of sys_refcursor.
Open the p_ccur for
Select * from a_os_lang_stls
where swb_number = p_sb_no
and PC_FLAG = 'C';
Could someone please help me how to convert the value separated by commas in a comma separated value new map to another table and pass it as part of the sys_refcursor.
Thanks in advance.
Kind regards
SB2011
Hello. Here are the queries for the two sys_refcursors.
(1) FOR THE FLAG = 'P '.
SELECT T1.ID,
T1. SWB_NUMBER,
T1. PC_NUMBER,
T1. PC_FLAG,
T1. INSTALLATION_ORD,
T1. SP_OR_LATER_VSN,
T1. PLATFORM,
T1. OS_CODE,
T2. LANG_CODE
DE)
SELECT T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
RTRIM (XMLAGG (XMLELEMENT(A,AG_OSCODE,',')). Extract ('//Text ()'), ',') OS_CODE
FROM (SELECT ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
(COLUMN_VALUE). GETNUMBERVAL() os_id
Of a_os_lang_stls t, xmltable (os) t1) T1.
OS_dtls T2
WHERE T2.ID = T1. OS_ID
GROUP OF T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
T1 PLATFORM),
(SELECT T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
RTRIM (XMLAGG (XMLELEMENT(A,LANGNAME,',')). Extract ('//Text ()'), ',') LANG_CODE
FROM (SELECT ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
(COLUMN_VALUE). GETNUMBERVAL() lang_id
Of a_os_lang_stls t, xmltable (lang) t1) T1.
lang_dtls T2
WHERE T2.ID = T1.lang_id
GROUP OF T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
T2 PLATFORM)
WHERE T1.ID = T2.ID
AND T1. SWB_NUMBER = T2. SWB_NUMBER
AND T1. PC_NUMBER = T2. PC_NUMBER
AND T1. INSTALLATION_ORD = T2. INSTALLATION_ORD
AND T1. PLATFORM = T2. PLATFORM
AND T1. PC_FLAG = "P";
(2) PC_FLAG FOR = 'C '.
SELECT T1.ID,
T1. SWB_NUMBER,
T1. PC_NUMBER,
T1. PC_FLAG,
T1. INSTALLATION_ORD,
T1. SP_OR_LATER_VSN,
T1. PLATFORM,
T1. OS_CODE,
T2. LANG_CODE
DE)
SELECT T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
RTRIM (XMLAGG (XMLELEMENT(A,AG_OSCODE,',')). Extract ('//Text ()'), ',') OS_CODE
FROM (SELECT ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
(COLUMN_VALUE). GETNUMBERVAL() os_id
Of a_os_lang_stls t, xmltable (os) t1) T1.
OS_dtls T2
WHERE T2.ID = T1. OS_ID
GROUP OF T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
T1 PLATFORM),
(SELECT T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
RTRIM (XMLAGG (XMLELEMENT(A,LANGNAME,',')). Extract ('//Text ()'), ',') LANG_CODE
FROM (SELECT ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
PLATFORM,
(COLUMN_VALUE). GETNUMBERVAL() lang_id
Of a_os_lang_stls t, xmltable (lang) t1) T1.
lang_dtls T2
WHERE T2.ID = T1.lang_id
GROUP OF T1.ID,
SWB_NUMBER,
PC_NUMBER,
PC_FLAG,
INSTALLATION_ORD,
SP_OR_LATER_VSN,
T2 PLATFORM)
WHERE T1.ID = T2.ID
AND T1. SWB_NUMBER = T2. SWB_NUMBER
AND T1. PC_NUMBER = T2. PC_NUMBER
AND T1. INSTALLATION_ORD = T2. INSTALLATION_ORD
AND T1. PLATFORM = T2. PLATFORM
AND T1. PC_FLAG = 'C ';
-
Left join of the two tables and multiple values into a single value separated by commas
Hello
I have following tables with their structures and their data as below.
CREATE TABLE 'BETODI '. "" BETINFO ".
(
VARCHAR2 (8 BYTE) "CURRENTPRESS."
ENABLE 'TYPEIDCONTAINER' VARCHAR2 (30 BYTE) NOT NULL
)
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ('A24G', 'PMC');
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ('A24D', 'Pensky-MARTENS');
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ("A25D", "CMP");
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ('A25G', 'PMC');
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ('A26D', 'PMC');
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ('A26G', 'PMC');
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ("A32G", "V-BFC3");
INSERT INTO Betinfo (Currentpress, typeidcontainer) VALUES ('A32D', "V-BFC2");
CREATE TABLE 'BETODI '. "" BETMASTER ".
(
ACTIVATE THE "CUREPRESS" TANK (5 BYTES) NOT NULL,
ACTIVATE THE "TYPE" VARCHAR2 (5 BYTE) NOT NULL,
NUMBER (5.0) "LASTPCIRIM".
)
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A24', '45 M 8', 15);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A25', 42 16', 15);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ("A26", 16' 45, 15);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ("A27", '45 M 34', 16);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A28', '45 M 34', 16);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A29', '45 M 34', 16);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A30', '45MCH', 15);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ("A31", "45MCH", 16);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A32', '45MCH', 16);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ('A33', '45MCH', 16);
INSERT INTO BetMaster (Curepress, type, lastpcirim) VALUES ("A34", "45MCH", 16);
These two tables have left join as
BETMASTER. CUREPRESS = substr (BETINFO. CURRENTPRESS, 1, 3)
now I want to have the data in the two tables with fields Curepress, Lastpcirim, typeidcontainer.
Also something like
Make a group of typeidcontainer if this value is greater than 1 by press separated the values of semicolon (;)
So, for example above, we should be given as
A24 PMC 15; PENSKY-MARTENS
A25 15 PMC
A26 15 PMC
A27 16 (NULL)
A28 16 (NULL)
A30 15 (NULL)
A31 16 (NULL)
A32 16 BFC2-V; V BFC3
A33 16 (NULL)
A34 16 (NULL)
How could do?
My current request is as
Select distinct Curepress, lastpcirim, typeidcontainer
BETMASTER STD left join INF BETINFO
on the trim (STD. CUREPRESS) = substr (trim (INF. CURRENTPRESS), 1, 3)
but I am unable to get the values separated by commas.
Any help would be appreciated.
Thank you
Mahesh.
Hi, Mahesh,
If you want to only 1 row of output for each distinct combination of currentpress and lastpcirim? This sounds like a job for GROUP BY.
And you want the row to contain a list of all different typidcontainers-delimited? This sounds like a job for the aggregate LISTAGG function.
WITH joined_data AS
(
SELECT DISTINCT
MST.curepress, mst.lastpcirim, inf.typeidcontainer
OF betmaster STD
LEFT JOIN betinfo ON TRIM (mst.curepress) inf = SUBSTR (TRIM (inf.currentpress)
1
3
)
)
SELECT curepress, lastpcirim
LISTAGG (typeidcontainer, ',')
THE Group (ORDER BY typeidcontainer) AS container_list
OF joined_data
Curepress GROUP, lastpcirim
;
Unfortunately, you can't say LISTAGG (DISTINCT ...), so you should always get the separate containers how you already are. (Note that the subquery is just what you posted).
Thanks for posting the CREATE TABLE and INSERT statements; It is very useful. Don't forget to tell what version of Oracle you are using. LISTAGG was new in Oracle 11.2.
Why not add CHECK constraints (and perhaps triggers) to your tables, so that curepress and currentpress are not stored with the head or trailing spaces? Then you wouldn't need to use the PAD in queries like this, and your code would be simpler and more effective.
-
extraction of data in a comma-deliniated in a Mysql database list
I have a database table called meetings. In the table of meetings, it has columns named 'meeid', 'meedate' and 'meememberIDs '. using ColdFusion 9, I am able to present a date Standard in the "meedate" and a comma-delimited list in memberID that was present from a series of checkboxes in a form. It looks like this:
meeid = 2
"meedate = '" 2014-06-15
meememberIDs = '3,5,67,78,354, 2345'
Now that I have a record of the date and a is list of comma-delineate of membersID who came to a meeting, possible using SQL support to extract the Member ID and numbers match the primary key of another table called 'personal' in which each column meememberIDs comma-delimited number would return the name and the email to the Member of the staff?
example:
3 = michael jones- [email protected]
5 = ebinger chris- [email protected]
67 = alfred Fox- [email protected]
College Kid,
Storage of lists separated by commas in a single database column is generally considered to be "a bad idea". Why? Mainly, for the simple reason you're struggling with - these data to other tables. A junction table or a relationship is the best way to store multiple values. Here's how this might work (there might be some subtle problems with the structure/query of the table syntax below that I have no experience with MySQL, only Microsoft SQL Server):
Table of assemblies:
meeid (integer)
meedate (date or time)
Table of personnel:
personnelID (or whatever it is called in your table) (integer)
FullName (varchar())
email (varchar())
... the rest columns in existing table
Table MeetingsPersonnel:
meeid (integer)
personnelID (integer)
Instead of storing a list separated by commas on identifying personal in the meetings table meememberIDs column, you would insert a record in the MeetingsPersonnel table for each combination of staff and the meeting. Thus in the example above, the three topics that you have demonstrated would be stored in the MeetingsPersonnel table like this:
meeid personnelID
2 3
2 5
2 67
Now if you want to generate a list of people who attend meetings, join meetings to staff through the MeetingsPersonnel table:
SELECT p.fullname, p.email FROM meetings m INNER JOIN meetingspersonnel mp on m.meeid = mp.meeid INNER JOIN personnel p on mp.personnelID = p.personnelID WHERE m.meedate = '2014-06-15'
If you create indexes on these tables, this arrangement will happen very, very quickly.
The alternative is to write your own function to parse the list separated by commas into a temporary table and then use the temporary table to be the intermediate join. It will be very inefficient, especially as the number of employees who attend a specific meeting increases.
-Carl V.
-
How to store the values separated by commas
Hi all
I have a table named discount, with discount_id (number data type) as one of the columns.
The user gives an entry as the value separated by commas, (ex: '123,27890,3543')
I use built-in proc that separates the values separated by commas.
Result set is stored in a table.DECLARE l_input VARCHAR2 (4000) := '123,27890,3543'; l_count BINARY_INTEGER; l_array DBMS_UTILITY.lname_array; BEGIN DBMS_UTILITY.comma_to_table ( list => REGEXP_REPLACE (l_input, '(^|,)', '\1x'), tablen => l_count, tab => l_array); DBMS_OUTPUT.put_line (l_count); FOR i IN 1 .. l_count LOOP DBMS_OUTPUT.put_line ( 'Element ' || TO_CHAR (i) || ' of array contains: ' || SUBSTR (l_array (i), 2)); END LOOP; END; Result: 3 Element 1 of array contains: 123 Element 2 of array contains: 27890 Element 3 of array contains: 3543
I would like to do a select on the table of discounts
Select * discount where discount_id (123, 27890 3543).
I am looking for options,
I need to create a new physical table as
Create table new_table (identification number) and bulk insert in this table.
Select * discount where discount_id in (select distinct id of new_table).
or
Is there a better way?
THX
Rod.Hello, SamFisher.
May be the recursive subquery factoring help you?WITH test(f1, n) AS (select '12, 15, 235', 1 from dual UNION all select f1, n + 1 from test where n < regexp_count('12, 15, 235', ',') + 1) SELECT regexp_substr(f1, '[^, ]+', 1, n) f FROM test
-
How to search for a particular text values separated by commas
Hello
I have a table for example. TB_Fruits.
In that I have a FruitsName (Varchar) column
In this column I store the string of values separated by commas.
Select FruitsName in the tb_fruits;
Result: orange, banana, Apple
Now the question is suppose that if I try inserting one of these fruits once again name, then it must not allow me to insert.
Suppose that now if I try to insert ('grapes, banana')
or
(Apple, grape")
the orange, banana, Apple may be in any position.
How to check if one of these names exist already or not in the fruitsname column?
I can't use INstr function here as or. because the position is not fixed chain even not.
Appreciate any help.Hmm, OK, the BASIC_LEXER in the documentation is specified is useful to "spaces separate languages". So not really a good suggestion from my side ;-)
Okay, so a few different choices, you can play with:
SQL> create table tb_fruits ( 2 fruitsname varchar2(60) 3 ) 4 / Table created. SQL> begin 2 insert into tb_fruits values ('BANANA,APPLE'); 3 insert into tb_fruits values ('YELLOW BANANA,ORANGE'); 4 insert into tb_fruits values ('GREEN APPLE,YELLOW ORANGE'); 5 insert into tb_fruits values ('APPLE,GREEN BANANA'); 6 commit; 7 end; 8 / PL/SQL procedure successfully completed.
Option 1:
Make a outdated AS operator. It just won't be fast because it's more likely will be full table scan (or scan restricted index full).
SQL> select fruitsname 2 from tb_fruits 3 where ','||fruitsname||',' like '%,'||'APPLE'||',%' 4 / FRUITSNAME ------------------------------------------------------------ BANANA,APPLE APPLE,GREEN BANANA SQL> select fruitsname 2 from tb_fruits 3 where ','||fruitsname||',' like '%,'||'BANANA'||',%' 4 / FRUITSNAME ------------------------------------------------------------ BANANA,APPLE SQL> select fruitsname 2 from tb_fruits 3 where ','||fruitsname||',' like '%,'||'YELLOW BANANA'||',%' 4 / FRUITSNAME ------------------------------------------------------------ YELLOW BANANA,ORANGE
Option 2:
Transform your data and replace the spaces with underscores. Which may or may not be a possibility for you. If your other data contains no underscores, you might fool your user interface using a view that replaces underscores with spaces when you select and a trigger before insert that replaces spaces with underscores to insert or update. Then, you can use the TEXT index.
SQL> create table tb_fruits2 as 2 select replace(fruitsname,' ','_') fruitsname 3 from tb_fruits 4 / Table created. SQL> begin 2 ctx_ddl.create_preference('mylex', 'BASIC_LEXER'); 3 ctx_ddl.set_attribute('mylex', 'printjoins', '_-'); 4 end; 5 / PL/SQL procedure successfully completed. SQL> create index fruitsname_idx on tb_fruits2 (fruitsname) 2 indextype is ctxsys.ctxcat 3 parameters ( 4 'stoplist ctxsys.empty_stoplist 5 LEXER mylex' 6 ) 7 / Index created. SQL> select fruitsname 2 from tb_fruits2 3 where catsearch(fruitsname,replace('YELLOW BANANA',' ','_'),null) > 0 4 / FRUITSNAME ------------------------------------------------------------ YELLOW_BANANA,ORANGE
(I used CTXCAT rather then CONTEXT indexes to keep simple search syntax, avoid SYNCHRONIZATION problems and others. You can use CONTEXT or CTXCAT as desired.)
Option 3:
Transform your data in XML format instead of values separated by commas. Then create a XMLIndex.
SQL> create table tb_fruits3 as 2 select xmltype('
') fruitsname 3 from tb_fruits 4 / Table created. SQL> create index fruitsname_xmlidx on tb_fruits3 (fruitsname) 2 indextype is xdb.xmlindex 3 / Index created. SQL> select fruitsname 2 from tb_fruits3 3 where xmlexists('$f/l[w="YELLOW BANANA"]' passing fruitsname as "f") 4 / FRUITSNAME --------------------------------------------------------------------------------'||replace(fruitsname,',',' ')||' YELLOW BANANA ORANGE (I used just 'l' for 'list of the words' and 'w' for 'word').
Option 4:
Create your own [url http://docs.oracle.com/cd/E11882_01/text.112/e24436/cdatadic.htm#i1008347] USER_LEXER instead of a variant of BASIC_LEXER. This would require allows you to create your own stored procedures for the index to be used, in which case you have complete control over what you set in the form of a token.
That's the different options I can think of right now ;-)
Maybe you are looking for
-
VBAI Custom LabVIEW Interface minimum size limit
I have a LabVIEW VI selected as my custom VBAI interface. I intend to run VBAI on a PC that is also running an executable (developed in LabVIEW). Both the executable and VBAI have graphical interfaces that need to remain visible during operation.
-
letters are partially faded out and very difficult to read
I was playing arounf in display, change of office. I have tried everything I can think in the control panel
-
Behavior very stange Photosmart B9180, prints with a huge amount of ink
Today, I have a huge problem (ink) with my photosmart B9180 I noticed that the prints come out almost dripping black ink. The ink flows paper and consists of all kinds of ink colors I tried HP paper glossy advanced photo When I select plain paper, (t
-
error 800b0100 code under vista when you run the update
Updates kb2345886 and kb971737 fail. I searched the forums and help sites; I used the system preparation tool and installed the KB947821 hotfix with her, and the updates always fail with error 800b0100 code. I don't know what to do at this point. Any
-
"Master Edition" and "Master Collection"?
Hey!I have a little problem with the registration of my Adobe Creative Suite. I started a new job this week and they gave me a license number and told me to download "Adobe Creative Suite 5.5 Master Edition" before work tomorrow... but the only thing