Extract under strings in a string with delimiters

I have a column that stores codes of different products in a series and is delimited by an slash (\). The length of the column is a VARCHAR2 (100). These are the products, the customer has purchased and have been stored in a table.
Still, the chain ends with the slash and is also used to separate products.

I would like to highlight only those customers who have purchased products that are internal. Thus, according to the data below, I want to pick up only customers 1001 and 1003 even if one of the product Codes is internal

Oracle 9i Version. I won't be able to use it to build WITH.

Scripts and Insert of statements:
CREATE TABLE CUSTOMER(
"CUSTOMER_ID" VARCHAR2(4 BYTE), 
"LAST_NAME" VARCHAR2(20 BYTE), 
"FIRST_NAME" VARCHAR2(20 BYTE));

Insert into CUSTOMER (CUSTOMER_ID,LAST_NAME,FIRST_NAME) values ('1001','Taylor','David');
Insert into CUSTOMER (CUSTOMER_ID,LAST_NAME,FIRST_NAME) values ('1002','Brown','Cynthia');
Insert into CUSTOMER (CUSTOMER_ID,LAST_NAME,FIRST_NAME) values ('1003','Green','Robert');
Insert into CUSTOMER (CUSTOMER_ID,LAST_NAME,FIRST_NAME) values ('1004','McManus','Donna');

CREATE TABLE PRODUCT (
"PRODUCT_ID" VARCHAR2(10 BYTE), 
"PRODUCT_NAME" VARCHAR2(30 BYTE), 
"INTERNAL_FLAG" VARCHAR2(1 BYTE));

Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR01','Product 01','Y');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR02','Product 02','Y');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR03','Product 03','N');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR04','Product 04','N');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR05','Product 05','N');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR06','Product 06','N');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR07','Product 07','Y');
Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('PR08','Product 08','N');

CREATE TABLE CUSTOMER_PRODUCT_SUMMARY(
"CUSTOMER_ID" VARCHAR2(4 BYTE), 
"PRODUCT_STRING" VARCHAR2(100 BYTE));

Insert into CUSTOMER_PRODUCT_SUMMARY (CUSTOMER_ID,PRODUCT_STRING) values ('1001','PR01\PR02\PR03\');
Insert into CUSTOMER_PRODUCT_SUMMARY (CUSTOMER_ID,PRODUCT_STRING) values ('1002','PR04\PR05\');
Insert into CUSTOMER_PRODUCT_SUMMARY (CUSTOMER_ID,PRODUCT_STRING) values ('1003','PR06\PR07\');
Insert into CUSTOMER_PRODUCT_SUMMARY (CUSTOMER_ID,PRODUCT_STRING) values ('1004','PR08\');
Thank you!

GVR wrote:
A way

select distinct c.customer_id from CUSTOMER c,PRODUCT p, CUSTOMER_PRODUCT_SUMMARY s
where c.customer_id=s.customer_id
and  s.product_string like '%'||p.PRODUCT_ID||'\%'
and INTERNAL_FLAG='Y';

By chance, it happens to work with the given sample data, but you must watch out for the problem of the 'mother's in chemotherapy
Say that add us to the sample data:

Insert into PRODUCT (PRODUCT_ID,PRODUCT_NAME,INTERNAL_FLAG) values ('R04','NOT Product 04','Y');

The query above has now customer_id = "1002", because his product_sting 'PRO4\PR05', which happens to include "R04\", even if that customer never bought this product.
You need ' \'s at the beginning of the strings, just as you need it at the end of the strings:

select distinct c.customer_id from CUSTOMER c,PRODUCT p, CUSTOMER_PRODUCT_SUMMARY s
where c.customer_id=s.customer_id
and  '\' || s.product_string like '%\'||p.PRODUCT_ID||'\%'     -- *****  CHANGED  *****
and INTERNAL_FLAG='Y';

Tags: Database

Similar Questions

  • Analyzes the string and extract the string delimiter

    Hello

    Basic questions.  Is this possible with the scan of regular expression of the string to extract the string that are in the specified delimiters.  Here is an example:

    Name of the \\Name of the folder 1\Name to the folder 2\Name to the folder 3\File

    Chain analysis can produce the following by specifying the regular expression on the right:

    1 folder name

    Name of the folder 2

    Name of the folder 3

    File name

    I tried \\\%s\\%s\\%s\\%s but the %s stops on the first white space.

    Thank you

    Michel

    RavensFan suggested the service appropriate for your condition, but you can also use an alternative, which is "spreadsheet of array of strings.

  • Problem with regexp_substr if the string with null values between commas.

    Hi all

    My version of DB is 10.1.0.5.0
    I want to extract the string values using query below, but I am unable to provide the correct result.
    WITH t  AS ( select '123,1,3,22' col FROM DUAL
            UNION ALL
            SELECT '123,,2,1' FROM DUAL
            UNION ALL
            SELECT '5,1,2,,' FROM DUAL
            ) 
    SELECT regexp_substr(t.col,'[^,]*',1,1)
          ,regexp_substr(t.col,'[^,]*',1,2)
          ,regexp_substr(t.col,'[^,]*',1,3)
          ,regexp_substr(t.col,'[^,]*',1,4) FROM DUAL,t   ;
    My required result as below.
    123     1      3      22
    123            2       1
    5       1      2        
    Please help me to get the required result by using regular expressions.
    Thanks, Ram

    Hello

    In Oracle 10, you can do so by combining REGEXP_SUBSTR with something else like RTRIM:

    SELECT     RTRIM (REGEXP_SUBSTR (col, '[^,]*(,|$)', 1, 1), ',')     AS part_1
    ,     RTRIM (REGEXP_SUBSTR (col, '[^,]*(,|$)', 1, 2), ',')     AS part_2
    ,     RTRIM (REGEXP_SUBSTR (col, '[^,]*(,|$)', 1, 3), ',')     AS part_3
    ,     RTRIM (REGEXP_SUBSTR (col, '[^,]*(,|$)', 1, 4), ',')     AS part_4
    FROM     t
    ;
    

    Starting Oracle 11 REGEXP_SUBSTR alone can do.

    But look at the first response; regular expressions will be probably less effective than less powerful features, especially when all channels have the same number of separators.

    Published by: Frank Kulash on 29 December 2012 08:36

  • Extract the string from the chain - separator = ' | '?

    Hi people!

    I want to know how to extract the a string with delimiter = XE field ' |'.

    For example:
    String = "field1 |" Field2 |... | fieldX |... | filedn | »

    I want to extract fieldX.

    Thanks for your help, regards.

    Use the functions like this substr and instr

    substr(string, instr( string,'|', 1, xth_occurrence)+1, instr( string,'|', 1,xth_occurrence+1) - instr(string,'|', 1, xth_occurrence))
    

    Luca

    Please, mark the reply as useful/correct if it is

    Published by: Luka on January 26, 2010 10:42

    Published by: Luka on January 26, 2010 10:42

  • How to convert the string with numbers in the table of Boolean 2D

    Hello

    I have input a string with comma separated numbers 1,192 (starting at 1).

    This string must be converted to a table 2D-boolean. Each number that appears should be true, not true rest.

    The 2D table consists of 4 times of 0.47 Boolean values.

    1.48--> [0.47] numbers [0]
    49.96--> [0.47] numbers [1]
    Numbers 97.144--> [0.47] [2]
    145.192--> [0.47] numbers [3]

    If a '1, 49, 97 145' input string put all [0] [0.3] true.

    How can it be easy/fast resolved?

    Thanks for help

    Break the string of numbers in a table of numbers.  (Spreasheet String to Array).

    In a loop For, index with each issue of this table.  Use in the range and Coerce to see if it is in the range of numbers.  (You can put this in a loop For as auto good indexing through the ranges).  If it's in the range, then use subset replace table to activate the corresponding item in a real.  If this is not the case, do nothing.  Maintain the table of Boolean in a shift register.

    Repeat this step for each number in your table.

    (What is a class assignment?)

  • How to convert the string with numbers in U8 with ascii

    Hello

    I have a string with only numbers 0. 9 paper.

    Now, I want to convert to table-U8.

    He works here, but now the problem: How can I change each character to its ascii value?

    Example:

    entry: 123 (string)

    output: x 31, x 32, x 33 (U8-array)

    Thanks for the help

    It's very easy

    String to Byte Array Function
    Have the Palette: string/array/path Conversion functions

    Converts a string to an array of unsigned bytes. Each byte in the array has the ASCII value of the character corresponding to the string.

  • Number of strings with decimal

    Hello community,

    I would like to convert numbers to the string with decimal separators. So if the number is 52351 then the string I need is 52 351

    Another example 18653284.9653235 becomes 18,653,284.9653235

    What would be the best way to do it?

    Thank you!

    Read this thread: https://forums.ni.com/t5/LabVIEW/comma-separator-for-large-numbers-how-to/m-p/2123090/highlight/true...

    Not the first person to wish for this idea.

  • How to concatenate the string with a digital command?

    Hello

    How to concatenate the string with a digital command?

    Thank you.

    I think I forgot to add the semicolon, what you can do is, drag the CONCATENATE function and add semicolon.

  • How the filter string with don't cares...?

    Hello

    I need help on getting filter string with cares. Attached is a VI for ref.

    If anyone has chain, analysis of expertise; I need your help.

    Thank you

    SB_LV

    Another fun one

  • Initialization of a string with a UTF-8 character

    It doesn't seem like it should be that hard, but I am trying to initialize a string with a UTF-8 character (specifically a degree after a few numbers symbol).

    I tried:

    Dim myString As String = new String ("\uc2b0", "UTF - 8");

    as well as a few permutations but did not have luck...

    Java strings are in Unicode, UTF - 8 is a way to represent these characters in a stream of bytes.

    Take a look at the following code, it might be useful: I suggest to put point break in the line add and take a look at the content of the two strings.

    No compiled code, could not work, I hope you get the idea...

    Char [] testchars = new char [] {'\u00B0', '\u0020'};
    String displayString = "undefined";
    Byte [] testBytes = new byte [] {(byte) (byte), 0xC2 0xB0, 0x20};
    String displayString2 = "no set2";
    try {}
    displayString = new String (testchars);
    displayString2 = new String(testBytes,"UTF-8");
    } catch (Exception e) {}
    }
    BasicEditField bef = new BasicEditField ("Test2:", displayString + ":" + displayString2);
    This.Add (BEF);

  • How to concatenate strings with the lines of a text file

    Hello
    I tried concatenate strings with the lines of a text file, but something is wrong with my code and I belive is the agruments I use in the cycle for. If anyone can help me I will appreciate it very much.
    My code is:
    [code]@echo off
    the value "input=C:\Users\123\Desktop\List.txt".
    for /f "usebackq tokens = *" % in (' input % ') do)
    the value 'str1 = C:\some directory\ ".
    the value ' str2 = %% ~ F '.
    the value "str3 = .pdf".
    the value "str4 = str1% str2% str3%.
    echo.%STR4%
    ) [/ code]
    and the text file is something like:
    121122 [code]
    122233
    123344
    124455 [/ code]
    But I get only one wrong answer and I have to run it like 3 times to get a real result and it is a mistake, the first two are empty spaces and gives the third one as the last line of the text file but repeated n times, where n is the number of lines in the text file.
    Result:
    [code] C:\Users\123\Desktop>concatenate.bat
    C:\Users\123\Desktop>concatenate.bat
    C:\Users\123\Desktop>concatenate.bat
    C:\some directory\124455.pdf
    C:\some directory\124455.pdf
    C:\some directory\124455.pdf
    C:\some directory\124455.pdf
    C:\some directory\124455.pdf
    C:\Users\123\Desktop>[/code]
    So if anyone has an idea about what is wrong please let me know.
    Concerning
    -Victor-

    Hi Victor,

    This forum is dedicated to the support of the Office of consumer Windows (fonts, colors, personal settings).  Since your question is about programming and usually outside the context of most of the customers, I suggest you post your question in the forums as http://msdn.microsoft.com - the Microsoft network to users will be more adapted to help you in your quest.
  • How to capture the data of type string with agent script and then compared to an alarm

    Hello...

    How to capture the string with agent of script data and then create a rule to compare the string data to generate alarm?

    Thank you!...

    Start here:

    http://en.community.Dell.com/TechCenter/performance-monitoring/Foglight-administrators/w/Admins-wiki/6155.custom-script-agent-1-leverage-an-existing-monitoring-script-to-push-data-into-Foglight

  • Extract the string from the string

    Hello guys,.

    I have a small question. I would like to extract a string to another string. Imagine the following string:

    param1 = value1 param2 = value2, param3 = value3, param4 = value4

    I would like to be able to extract value2 and value3 to this string. I know that the design of the db is not perfect and should be like this. but it is historical and I have to use this way. Any suggestion?

    Thank you

    to retrieve param2

    Select

    substr (s

    , instr (s, '=', 1, 2) + 1

    , instr (s, ',', 1, 2) - instr (s, '=', 1, 2) - 1

    ) r

    from (select "param1 = value1 param2 = value2, param3 = value3, param4 = value4's double)

    or

    Select regexp_substr (your_string, "[^,] +' 1, 4") from your_table

    for example

    Select regexp_substr ("param1 = value1 param2 = value2, param3 = value3, param4 = value4 ',' [^,] +' 1, 4") param2 double

    PARAM2

    'value2 '.

    Post edited by: chris227
    Corrected solution substr (sorry was before the first coffee ;-))

  • Search strings / with some applied condition

    Hello comrades,.

    I am writing an extendscript which is supposed to loop through all of the PGF and find all the strings / with a certain condition applied (say, comment).

    The problem is that in the script guide, I couldn't find a function that retrieves the status of character property. I tried to use the function "charAt() (i)" js, but it doesn't seem to work in ARE. No idea how to implement such a function?

    Here's the 1st draft of the script.

    var doc is app. ActiveDoc;

    If doc. {ObjectValid()}

    checkCondFMt (doc);

    }

    else {}

    Alert ("no open section");

    }

    function checkCondFMt (doc) {}

    FMP var is doc. MainFlowInDoc.FirstTextFrameInFlow.FirstPgf;

    var CondObj is doc. GetNamedObject ("Comment");

    While (FMP. {ObjectValid()})

    var textItems is bmp. GetText(Constants.FTI_String |) Constants.FTI_LineEnd);

    var b = new TextRange();

    TR. Beg.obj = tr.end.obj = textItems;

    TR. Beg.offset = 0;

    for (var i = 0; i < tr.len; i ++) {}

    var c = tr.charAt (i);

    var PgfProps is doc. GetTextVal c [i], Constants.FO_CondFmt;

    Alert (PgfProps.Name);

    }

    PGF = bmp. NextPgfInFlow;

    }

    }

    Thanks in advance for your comments!

    OK, I see the problem now. JavaScript doesn't have a "block scope" for its variables. She carried the function, so your 'i' variable is used in more than a loop. You must use a different variable for the inner loop:

    for (var j = 0; j < oCond.length; j += 1) {
        if (oCond[j].Name == CondObj.Name) {
            applyCharFmt(textRange, doc);
        }
    }
    

    In the code example above, I use 'j' for a counter for the inner loop.

    In general, you can avoid problems of this kind to declare all your variables at the top of the function:

    function functionName (param1, param2) {
    
        var i, j, textlist; // etc.
    
        // function code...
    }
    

    That makes it easier to 'follow' variables and make sure that you do not use one more than once.

    -Rick

  • I'm trying to extract the strings and load them into a text-helpplease file

    I'm trying to extract the strings and load them into a file text without space between them - see below

    p_csa = ISCC M4 DP

    where p_csa is a tring to load into a text file



    Code:

    SELECT SUBSTR (p_csa, 0, 0) INTO v_telco FROM DUAL;
    SELECT SUBSTR (p_csa, 1, 4) INTO v_comp FROM DUAL;
    SELECT SUBSTR (p_csa, 5.3) INTO v_csa_prefix FROM DUAL;
    SELECT SUBSTR (p_csa, 8, 4) INTO v_csa_type FROM DUAL;

    fileidinvoice: = UTL_FILE. FOPEN (c_data_location, filenameinvoice, 'W');
    fileidlog: = UTL_FILE. FOPEN (c_data_location, filenamelog, 'W');

    UTL_FILE. PUT_LINE)
    fileidinvoice, v_telco | » '|| v_comp | "|" | v_csa_prefix: "| v_csa_type);


    -the content of the file-

    ISCC M4 DP

    =====================
    I want to remove the space between the chain above for the content of the file should look like this:

    -the content of the file-

    GCSIM4DP

    Hello

    976253 wrote:
    I'm trying to extract the strings and load them into a file text without space between them - see below

    p_csa = ISCC M4 DP

    where p_csa is a tring to load into a text file

    Code:

    SELECT SUBSTR (p_csa, 0, 0) INTO v_telco FROM DUAL;

    Is it always NULL?

    SELECT SUBSTR (p_csa, 1, 4) INTO v_comp FROM DUAL;

    You don't need the double table much in PL/SQL. You can simply say

    v_comp := SUBSTR (p_csa, 1, 4);
    

    Almost all integrated single-row functions work in PL/SQL. (NVL2 is the only one I know who does not work in PL/SQL).

    SELECT SUBSTR (p_csa, 5.3) INTO v_csa_prefix FROM DUAL;
    SELECT SUBSTR (p_csa, 8, 4) INTO v_csa_type FROM DUAL;

    fileidinvoice: = UTL_FILE. FOPEN (c_data_location, filenameinvoice, 'W');
    fileidlog: = UTL_FILE. FOPEN (c_data_location, filenamelog, 'W');

    UTL_FILE. PUT_LINE)
    fileidinvoice, v_telco | » '|| v_comp | "|" | v_csa_prefix: "| v_csa_type);

    What are you trying to do here? For example, what you're trying to put between c_comp and v_csa_prefix?

    -the content of the file-

    ISCC M4 DP

    =====================
    I want to remove the space between the chain above for the content of the file should look like this:

    -the content of the file-

    GCSIM4DP

    If you don't want space, then only concatenate all the spaces in the string before you write it and REPLACE allows you to delete all the spaces that have been copied from p_csa. For example:

    UTL_FILE.PUT_LINE ( fileidinvoice
                , REPLACE ( v_telco || v_comp
                                        || v_csa_prefix
                              || v_csa_type
                       , ' '
                       )
                );
    

    I guess you need the v_comp of separate variables, the v_csa_prefix and the v_csa_type for something.

    I hope that answers your question.
    If this isn't the case, after a complete script that people can run to recreate the problem and test their ideas. Display the results you want (in other words, the contents of the file created).
    Always say what version of Oracle you are using (for example, 11.2.0.3.0).
    See the FAQ forum {message identifier: = 9360002}

Maybe you are looking for