| From: | Ron St-Pierre <rstpierre(at)syscor(dot)com> | 
|---|---|
| To: | pativo <pativo(at)arcor(dot)de>, pgsql-general <pgsql-general(at)postgresql(dot)org> | 
| Subject: | Re: String manipulation | 
| Date: | 2004-02-17 20:06:38 | 
| Message-ID: | 4032744E.8040708@syscor.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
pativo wrote:
>Hello to all, 
>
>I have small problem. I have some database fields (VARCHAR) 
>and these field should hold some ahex coded values. So the 
>string length must be even and each character can only be 
>0-9, a-f or A-F. 
>My idea was that: 
>
>====8<----------------------------------- 
>
>CREATE TABLE test ( 
>    id   INT4         PRIMARY KEY NOT NULL DEFAULT nextID(), 
>    text VARCHAR(150) NOT NULL CHECK(isAHex(text)) 
>); 
>
>CREATE FUNCTION isAHex(VARCHAR) RETURNS BOOLEAN AS ' 
>   DECLARE 
>      text_p ALIAS FOR $1; 
>   BEGIN 
>      IF ((length(text_p) % 2) <> 0) THEN 
>         RETURN FALSE; 
>      END IF; 
>      -- TODO How to check each character 
>      RETURN TRUE; 
>   END; 
>' LANGUAGE 'plpgsql'; 
>
>====8<----------------------------------- 
>
>Has anybody an idea how could I check each character? 
>I would prefer a solution in plpgsql!! 
>
>Thank! 
>
>
>pativo 
>
>  
>
Here's one solution:
CREATE OR REPLACE FUNCTION isAHex(text) RETURNS boolean as '
        DECLARE
                inputText ALIAS FOR $1;
                tempChar text;
                isHex boolean;
        BEGIN
                isHex = true;
                IF ((length(inputText) % 2) <> 0) THEN
                    return FALSE;
                END IF;
                FOR i IN 1..length(inputText) LOOP  
                    tempChar := substr(inputText, i, 1);
                    IF tempChar ~ ''[g-z]'' THEN
                        return FALSE;
                    ELSE IF tempChar ~ ''[G-Z]'' THEN
                        return FALSE;
                    END IF;
                END LOOP;
               
                return isHex;
        END;
' LANGUAGE 'plpgsql';
You may have to check the IF...ELSE IF... stuff but this should work. 
I've used a very similar one to check if a value is numeric.
Ron
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Mike Nolan | 2004-02-17 20:16:39 | Re: how to merge a table from another DB | 
| Previous Message | Anton Nikiforov | 2004-02-17 19:59:00 | Select statment question |