blob: 00cbf5cc6bb2f169a7d3cae6e7a57cf29b4b074f [file] [log] [blame]
drop table if exists phone_book;
create table phone_book
(
lname char varying(25),
fname char varying(25),
state char(2),
phone_num bigint
)
distributed by (lname);
\copy public.phone_book from 'data/phone_book.txt' delimiter as '|'
drop table if exists phone_book_substr;
create table phone_book_substr
(
lname_substr char(3),
lname char varying(25),
fname char varying(25),
state char(2),
phone_num bigint
)
distributed by (lname_substr);
--distributed by (substr(lname,1,2));
insert into
phone_book_substr
(
lname_substr,
lname,
fname,
state,
phone_num
)
select
substr(lname,1,3),
lname,
fname,
state,
phone_num
from phone_book
order by lname
;
analyze phone_book_substr;
select count(*)
from phone_book_substr
;
--17388
---------------------------------------------------------
select lname_substr
from phone_book_substr
where lname_substr LIKE 'Aa' group by 1 order by 1;
--0 Rows.
select lname_substr
from phone_book_substr
where lname_substr LIKE 'A%' group by 1 order by 1;
select count(*)
from phone_book_substr
where lname_substr LIKE 'A%';
--621
select lname_substr
from phone_book_substr
where lname_substr LIKE '_a_' group by 1 order by 1;
select lname_substr
from phone_book_substr
where lname_substr LIKE '_Z_' group by 1 order by 1;
--0 Rows.
select lname_substr
from phone_book_substr
where lname_substr LIKE 'Abd' group by 1 order by 1;
--0 Rows.
-- ~~ is equivalent to LIKE
select count(*)
from phone_book_substr
where lname_substr ~~ 'A%';
--621
select count(*)
from phone_book_substr
where lname_substr ~~ '_b_';
--3240
-- ILIKE case sensitive LIKE
select count(*)
from phone_book_substr
where lname_substr ILIKE 'a%';
-- ~~* is equivalent to ILIKE
select count(*)
from phone_book_substr
where lname_substr ~~* 'a%';
--621
select count(*)
from phone_book_substr
where lname_substr ~~* '_b_';
--3240
-- NOT LIKE
select lname_substr
from phone_book_substr
where lname_substr NOT LIKE 'Z%' group by 1 order by 1;
-- !~~ is equivalent to NOT LIKE
select count(*)
from phone_book_substr
where lname_substr !~~ 'A%';
--16767
select count(*)
from phone_book_substr
where lname_substr !~~ '_A%';
--17388
select count(*)
from phone_book_substr
where lname_substr !~~ '_b%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~ '_B%';
--17388
select count(*)
from phone_book_substr
where lname_substr !~~ '_b%';
--14148
-- !~~* is equivalent to NOT ILIKE
select count(*)
from phone_book_substr
where lname_substr !~~* 'a%';
--16767
select count(*)
from phone_book_substr
where lname_substr !~~* '_A%';
--16740
select count(*)
from phone_book_substr
where lname_substr !~~* '_b%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~* '_B%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~* '_B_';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~* '_b_';
--14148
-- ARRAY
--select array(select fname
-- from phone_book_substr
-- where lname_substr LIKE '%y%');
--select count(*)
--from phone_book_substr
--;
--17388
---------------------------------------------------------
-- ILIKE case sensitive LIKE
select count(*)
from phone_book_substr
where lname_substr ILIKE 'a%';
--621
select count(*)
from phone_book_substr
where lname_substr ILIKE 'A%';
--621
select count(*)
from phone_book_substr
where lname_substr ILIKE 'Aa';
--0
select count(*)
from phone_book_substr
where lname_substr ILIKE '_a_';
--648
select count(*)
from phone_book_substr
where lname_substr ILIKE '_Z_';
--0
select count(*)
from phone_book_substr
where lname_substr ILIKE 'Abd';
--0
--select count(*)
--from phone_book_substr
--;
--17388
---------------------------------------------------------
-- NOT SIMILAR TO
-- | is equivalent to LOGICAL "OR"
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '(A|B)%';
--16146
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'A%';
--16767
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'B%';
--16767
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'A%'
AND lname_substr NOT SIMILAR TO 'B%';
--16146
-------------------------------------------
-- * denotes repetition of the previous item zero or more times.
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '(A|B)*';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'A*';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'B*';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'A*'
AND lname_substr NOT SIMILAR TO 'B*';
--17388
-------------------------------------------
-- + denotes repetition of the previous item zero or more times.
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '(A|B)+';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'A+';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'B+';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO 'A+'
AND lname_substr NOT SIMILAR TO 'B+';
--17388
-------------------------------------------
-- [...] denotes specifies a character class.
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '([A...]|[B...])';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '[A...]';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '[B...]';
--17388
select count(*)
from phone_book_substr
where lname_substr NOT SIMILAR TO '[A...]'
AND lname_substr NOT SIMILAR TO '[B...]';
--17388
--select count(*)
--from phone_book_substr
--;
--17388
---------------------------------------------------------
-- ~~ is equivalent to LIKE
select count(*)
from phone_book_substr
where lname_substr !~~ 'A%';
--16767
select count(*)
from phone_book_substr
where lname_substr !~~ '_A%';
--17388
select count(*)
from phone_book_substr
where lname_substr !~~ '_b%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~ '_B%';
--17388
select count(*)
from phone_book_substr
where lname_substr !~~ 'B%';
--16767
select count(*)
from phone_book_substr
where lname_substr !~~ '_b_';
--14148
-----------------------------------------------------------------
---substring(string from pattern for escape character)
-- provides extraction of a substring that matches a SQL
-- regular expression. To indicate the part of the pattern
-- that should be returned on success, the pattern must
-- contain two occurrences of the escape character
-- followed by a double quote ("). The
-- text matching the portion of the pattern between these markers
-- is returned.
----------------------------------------------------------
SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
-- substring
-----------
-- 123
--(1 row)
SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
-- substring
-----------
-- 1
--(1 row)
----------------------------------------------------------
----------------------------------------------------------
--select substring(lname from '%#"Z_y#"%' for '#') IS NOT NULL
--from phone_book_substr
--where substring(lname from '%#"Z_y#"%' for '#') IS NOT NULL
--;
-- returns 27 rows.
-- lname | substring
-----------+-----------
-- Zdygahd | Zdy
select lname, substring(lname from '%#"Z_yg_h#"%' for '#')
from phone_book_substr
where substring(lname from '%#"Z_yg_h#"%' for '#') IS NOT NULL
;
-- returns 27 rows.
-- lname | substring
---------+-----------
-- Zdygahd | Zdy
--select lname, substring(lname from '%\\"Z_yg_h\\"%' for '\\')
--from phone_book_substr
--where substring(lname from '%\\"Z_yg_h\\"%' for '\\') IS NOT NULL
--;
-- returns 27 rows.
-- lname | substring
---------+-----------
-- Zdygahd | Zdy
--select DISTINCT lname, substring(lname from '%\\"__yg_h\\"%' for '\\')
--from phone_book_substr
--where substring(lname from '%\\"__yg_h\\"%' for '\\') IS NOT NULL
--;
--dygahd | Adygah
-- Bdygahd | Bdygah
-- Cdygahd | Cdygah
-- Ddygahd | Ddygah
-- Edygahd | Edygah
-- Fdygahd | Fdygah
-- Gdygahd | Gdygah
-- Hdygahd | Hdygah
-- Idygahd | Idygah
-- Jdygahd | Jdygah
-- Kdygahd | Kdygah
-- Keygahd | Keygah
-- Ldygahd | Ldygah
-- Liygahd | Liygah
-- Mdygahd | Mdygah
-- Moygahd | Moygah
-- Ndygahd | Ndygah
-- Nuygahd | Nuygah
-- Odygahd | Odygah
-- Pdygahd | Pdygah
-- Rdygahd | Rdygah
-- Sdygahd | Sdygah
-- Udygahd | Udygah
-- Gdygahd | Gdygah
-- Hdygahd | Hdygah
-- Idygahd | Idygah
-- Jdygahd | Jdygah
-- Kdygahd | Kdygah
-- Keygahd | Keygah
-- Ldygahd | Ldygah
-- Liygahd | Liygah
-- Mdygahd | Mdygah
-- Moygahd | Moygah
-- Ndygahd | Ndygah
-- Nuygahd | Nuygah
-- Odygahd | Odygah
-- Pdygahd | Pdygah
-- Rdygahd | Rdygah
-- Sdygahd | Sdygah
-- Udygahd | Udygah
-- Vdygahd | Vdygah
-- Wdygahd | Wdygah
-- Xdygahd | Xdygah
-- Ydygahd | Ydygah
-- Zdygahd | Zdygah
------------------------------------------------------------------------
-- The function regexp_replace: Regular Expression Replace.
-- The syntax for regexp_replace is
-- regexp_replace(source, pattern, replacement[,flags])
-- The syntax is reg
------------------------------------------------------------------------
select regexp_replace('foobarbaz', 'b..', 'X');
-- regexp_replace
----------------
-- fooXbaz
--(1 row)
select regexp_replace('foobarbaz', 'b..', 'X', 'g');
-- regexp_replace
----------------
-- fooXX
--(1 row)
--select regexp_replace('foobarbaz', 'b(..)', E'X\\1Y', 'g');
-- regexp_replace
----------------
-- fooXarYXazY
--(1 row)
select regexp_replace('Zdygahd', 'yg','GY')
;
-- regexp_replace
----------------
-- ZdGYahd
--(1 row)
select DISTINCT lname, regexp_replace(lname, '...g..','G')
from phone_book_substr order by lname
;
-- lname | regexp_replace
---------+----------------
-- Aadgahd | Gd
-- Abegahd | Gd
-- Abfgahd | Gd
-- Abggahd | Gd
-- Abhgahd | Gd
-- Abigahd | Gd
--.............
--..............
-- Zdugahd | Gd
-- Zdvgahd | Gd
-- Zdwgahd | Gd
-- Zdxgahd | Gd
-- Zdygahd | Gd
-- Zdzgahd | Gd
--(644 rows)
select DISTINCT lname, regexp_replace(lname, '...g...','G')
from phone_book_substr order by lname
;
-- lname | regexp_replace
-----------+----------------
-- Aadgahd | G
-- Abegahd | G
-- Abfgahd | G
--...............
--...............
-- Zdxgahd | G
-- Zdygahd | G
-- Zdzgahd | G
--(644 rows)
select DISTINCT lname, regexp_replace(lname, '...g...','...G...')
from phone_book_substr order by lname
;
-- lname | regexp_replace
-----------+----------------
-- Aadgahd | ...G...
-- Abegahd | ...G...
--...............
--...............
-- Zdxgahd | ...G...
-- Zdygahd | ...G...
-- Zdzgahd | ...G...
--(644 rows)
select DISTINCT lname, regexp_replace(lname, 'A..g..d','a..G..D')
from phone_book_substr order by lname
;
-- lname | regexp_replace
-----------+----------------
-- Aadgahd | a..G..D
-- Abegahd | a..G..D
-- Abfgahd | a..G..D
--...............
--...............
-- Adzgahd | a..G..D
-- Badgahd | Badgahd
-- Bbegahd | Bbegahd
--...............
--...............
-- Zdxgahd | Zdxgahd
-- Zdygahd | Zdygahd
-- Zdzgahd | Zdzgahd
--(644 rows)
select DISTINCT lname, regexp_replace(lname, 'a','Z','ig')
from phone_book_substr order by lname
;
-- replaces 'a' with 'Z' globally. The matching is case-insensitive.
-- flag 'g' is global replacement and flag 'i' is for matching
-- case-insensitive.
-- lname | regexp_replace
-----------+----------------
-- Aadgahd | ZZdgZhd
-- Abegahd | ZbegZhd
-- Abfgahd | ZbfgZhd
-- Abggahd | ZbggZhd
--...................
--...................
-- Zdwgahd | ZdwgZhd
-- Zdxgahd | ZdxgZhd
-- Zdygahd | ZdygZhd
-- Zdzgahd | ZdzgZhd
--(644 rows)
-- match 3rd occurance of 'a' (parenthesized subrexpression of the
-- pattern should be inserted.) and replace it with 'Z'
-- \& indicates that the substring matching the entire pattern
-- shouldbeisered.
--select DISTINCT lname, regexp_replace(lname, 'a(..)','\\3\\&Z','g')
--from phone_book_substr
--;
-- lname | regexp_replace
-----------+----------------
-- Aadgahd | AadgZahdZ
-- Abegahd | AbegahdZ
-- Abfgahd | AbfgahdZ
--...................
--...................
-- Zdwgahd | ZdwgahdZ
-- Zdxgahd | ZdxgahdZ
-- Zdygahd | ZdygahdZ
-- Zdzgahd | ZdzgahdZ
--(644 rows)
--select DISTINCT lname, regexp_replace(lname, 'yg','GY')
--from phone_book_substr
--where substring(lname from '%\\"yg\\"%' for '\\') IS NOT NULL
--;
-- lname | regexp_replace
-----------+----------------
-- Adygahd | AdGYahd
-- Bdygahd | BdGYahd
-- Cdygahd | CdGYahd
-- Ddygahd | DdGYahd
-- Edygahd | EdGYahd
--..................
--..................
-- Udygahd | UdGYahd
-- Vdygahd | VdGYahd
-- Wdygahd | WdGYahd
-- Xdygahd | XdGYahd
-- Ydygahd | YdGYahd
-- Zdygahd | ZdGYahd
--(28 rows)
--select DISTINCT lname, regexp_replace(lname, 'yg.h.','GY')
--from phone_book_substr
--where substring(lname from '%\\"yg_h\\"%' for '\\') IS NOT NULL
--;
-- lname | regexp_replace
-----------+----------------
-- Adygahd | AdGY
-- Bdygahd | BdGY
-- Cdygahd | CdGY
-- Ddygahd | DdGY
--........................
--........................
-- Wdygahd | WdGY
-- Xdygahd | XdGY
-- Ydygahd | YdGY
-- Zdygahd | ZdGY
--(28 rows)
-----------------------------------------------------------------------
SELECT regexp_matches('foobarbequebaz', '(bar)(beque)');
-- regexp_matches
----------------
-- {bar,beque}
--(1 row)
SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g');
-- regexp_matches
----------------
-- {bar,beque}
-- {bazil,barf}
--(2 rows)
SELECT regexp_matches('foobarbequebaz', 'barbeque');
-- regexp_matches
----------------
-- {barbeque}
--(1 row)
select regexp_matches('Aadgahd', '(ad)');
-- regexp_matches
----------------
-- {ad}
--(1 row)
select DISTINCT lname, regexp_matches(lname, 'yg')
from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Adygahd | {yg}
-- Bdygahd | {yg}
-- Cdygahd | {yg}
-- Ddygahd | {yg}
-- Edygahd | {yg}
-- ..............
-- ..............
-- Vdygahd | {yg}
-- Wdygahd | {yg}
-- Xdygahd | {yg}
-- Ydygahd | {yg}
-- Zdygahd | {yg}
--(28 rows)
select DISTINCT lname, regexp_matches(lname, 'z_y') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, 'z') from phone_book_substr order by lname;
-- lname | regexp_matches
---------+----------------
-- Adzgahd | {z}
-- Bdzgahd | {z}
-- Cdzgahd | {z}
-- Ddzgahd | {z}
--..............
--..............
-- Wdzgahd | {z}
-- Xdzgahd | {z}
-- Ydzgahd | {z}
-- Zdzgahd | {z}
--(28 rows)
select DISTINCT lname, regexp_matches(lname, 'Z') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Zadgahd | {Z}
-- Zbegahd | {Z}
-- Zbfgahd | {Z}
-- Zbggahd | {Z}
--..............
--..............
-- Zdxgahd | {Z}
-- Zdygahd | {Z}
-- Zdzgahd | {Z}
--(23 rows)
select DISTINCT lname, regexp_matches(lname, 'W') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Wadgahd | {W}
-- Wbegahd | {W}
-- Wbfgahd | {W}
-- Wbggahd | {W}
--..............
--..............
-- Wdxgahd | {W}
-- Wdygahd | {W}
-- Wdzgahd | {W}
--(23 rows)
select DISTINCT lname, regexp_matches(lname, '^W') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Wadgahd | {W}
-- Wbegahd | {W}
-- Wbfgahd | {W}
--.............
--..............
-- Wdxgahd | {W}
-- Wdygahd | {W}
-- Wdzgahd | {W}
--(23 rows)
select DISTINCT lname, regexp_matches(lname, '^W_x') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, '^W_x____') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, '^W_x*') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, '^W_x$d') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, '(dad)') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
--Changed to First Name from Last Name.
select DISTINCT fname, regexp_matches(fname, '(dad)') from phone_book_substr order by lname;
-- fname | regexp_matches
---------+----------------
-- Aahdadj | {dad}
-- Abhdadj | {dad}
-- Achdadj | {dad}
-- Adhdadj | {dad}
--................
--................
-- Zuhdadj | {dad}
-- Zwhdadj | {dad}
-- Zxhdadj | {dad}
-- Zyhdadj | {dad}
--(377 rows)
select DISTINCT fname, regexp_matches(fname, '(uh)(ad)') from phone_book_substr ;
-- fname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT fname, regexp_matches(fname, '(uh)(dad)') from phone_book_substr order by fname;
-- fname | regexp_matches
-----------+----------------
-- Auhdadj | {uh,dad}
-- Buhdadj | {uh,dad}
-- Duhdadj | {uh,dad}
--...................
--...................
-- Xuhdadj | {uh,dad}
-- Yuhdadj | {uh,dad}
-- Zuhdadj | {uh,dad}
--(19 rows)
select DISTINCT fname, regexp_matches(fname, '(uhdad)') from phone_book_substr order by fname;
-- fname | regexp_matches
-----------+----------------
-- Auhdadj | {uhdad}
-- Buhdadj | {uhdad}
-- Duhdadj | {uhdad}
--..................
--..................
-- Xuhdadj | {uhdad}
-- Yuhdadj | {uhdad}
-- Zuhdadj | {uhdad}
--(19 rows)
select DISTINCT fname, regexp_matches(fname, '(y)','i') from phone_book_substr order by fname;
-- fname | regexp_matches
-----------+----------------
-- Ayhdadj | {y}
-- Byhdadj | {y}
-- Dyhdadj | {y}
--..............
--..............
-- Vyhdadj | {y}
-- Xyhdadj | {y}
-- Yahdadj | {Y}
-- Ybhdadj | {Y}
-- Ychdadj | {Y}
-- Ydhdadj | {Y}
--..............
--..............
-- Yxhdadj | {Y}
-- Yyhdadj | {Y}
-- Zyhdadj | {y}
--(33 rows)
select DISTINCT fname, regexp_matches(fname, '(y|h)','i') from phone_book_substr order by fname;
-- fname | regexp_matches
-----------+----------------
-- Aahdadj | {h}
-- Abhdadj | {h}
--..............
-- Bghdadj | {h}
-- Bihdadj | {h}
--..............
-- Yxhdadj | {Y}
-- Yyhdadj | {Y}
-- Zahdadj | {h}
--..............
-- Zxhdadj | {h}
-- Zyhdadj | {y}
--(377 rows)
--
--Exactly one match {1}
select DISTINCT fname, regexp_matches(fname, '(y|h){1}','i') from phone_book_substr order by fname;
-- fname | regexp_matches
-----------+----------------
-- Aahdadj | {h}
-- Abhdadj | {h}
-- Achdadj | {h}
-- Adhdadj | {h}
--..............
-- Vyhdadj | {y}
-- Wahdadj | {h}
--..............
-- Xwhdadj | {h}
-- Xxhdadj | {h}
-- Xyhdadj | {y}
-- Yahdadj | {Y}
--..............
-- Yxhdadj | {Y}
-- Yyhdadj | {Y}
-- Zahdadj | {h}
--..............
-- Zwhdadj | {h}
-- Zxhdadj | {h}
-- Zyhdadj | {y}
--(377 rows)
select DISTINCT fname, regexp_matches(fname, '(W){2}','i') from phone_book_substr ;
-- fname | regexp_matches
-------+----------------
--(0 rows)
--Exactly two consecutive matches {2}.
--Is this right?
select DISTINCT fname, regexp_matches(fname, '(d){2}','i') from phone_book_substr ;
-- fname | regexp_matches
---------+----------------
-- Ddhdadj | {d}
--(1 row)
--One or more but not more than two.
--Is this right?
select DISTINCT fname, regexp_matches(fname, '(d){1,2}','i') from phone_book_substr order by fname;
-- fname | regexp_matches
---------+----------------
-- Aahdadj | {d}
-- Abhdadj | {d}
-- Achdadj | {d}
--..............
-- Dahdadj | {D}
-- Dbhdadj | {D}
-- Dchdadj | {D}
-- Ddhdadj | {d}
-- Dehdadj | {D}
-- Dfhdadj | {D}
--..............
-- Zwhdadj | {d}
-- Zxhdadj | {d}
-- Zyhdadj | {d}
--(424 rows)
--
--Two or more matches {2,}
select DISTINCT lname, regexp_matches(lname, '(d){2,}','i') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Ddsgahd | {d}
-- Ddtgahd | {d}
-- Ddugahd | {d}
-- Ddvgahd | {d}
-- Ddwgahd | {d}
-- Ddxgahd | {d}
-- Ddygahd | {d}
-- Ddzgahd | {d}
--(8 rows)
--
--3 or more matches.
--Is this right?
select DISTINCT lname, regexp_matches(lname, '(d){3,}','i') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
--Exactly 3 matches
select DISTINCT lname, regexp_matches(lname, '(d){3}','i') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
--Two or more but not more than 3 matches.
select DISTINCT lname, regexp_matches(lname, '(d){2,3}','i') from phone_book_substr order by lname;
-- lname | regexp_matches
---------+----------------
-- Ddsgahd | {d}
-- Ddtgahd | {d}
-- Ddugahd | {d}
-- Ddvgahd | {d}
-- Ddwgahd | {d}
-- Ddxgahd | {d}
-- Ddygahd | {d}
-- Ddzgahd | {d}
--(8 rows)
--
--One or more but not more than 2 matches.
--Is this right?
select DISTINCT lname, regexp_matches(lname, '(d){1,2}','i') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Aadgahd | {d}
-- Abegahd | {d}
-- Abfgahd | {d}
--..............
-- Ddvgahd | {d}
-- Ddwgahd | {d}
-- Ddxgahd | {d}
--..............
-- Zdxgahd | {d}
-- Zdygahd | {d}
-- Zdzgahd | {d}
--(644 rows)
select DISTINCT lname, regexp_matches(lname, '(d.d)','i') from phone_book_substr ;
-- lname | regexp_matches
---------+----------------
-- Dadgahd | {Dad}
--(1 row)
select DISTINCT lname, regexp_matches(lname, '(g.h)', 'i') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Aadgahd | {gah}
-- Abegahd | {gah}
-- Abfgahd | {gah}
--................
-- Zdxgahd | {gah}
-- Zdygahd | {gah}
-- Zdzgahd | {gah}
--(644 rows)
select DISTINCT lname, regexp_matches(lname, '[zh]', 'i') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Aadgahd | {h}
-- Abegahd | {h}
-- Abfgahd | {h}
--..............
-- Gdygahd | {h}
-- Gdzgahd | {z}
-- Hadgahd | {H}
-- Hbegahd | {H}
--..............
-- Ydygahd | {h}
-- Ydzgahd | {z}
-- Zadgahd | {Z}
--..............
-- Zdxgahd | {Z}
-- Zdygahd | {Z}
-- Zdzgahd | {Z}
--(644 rows)
select DISTINCT fname, regexp_matches(fname, '(h){2}','i') from phone_book_substr ;
-- fname | regexp_matches
-------+----------------
--(0 rows)
--Two or more matches.
select DISTINCT lname, regexp_matches(lname, '(h){2,}','i') from phone_book_substr ;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT fname, regexp_matches(fname, '(x){2}','i') from phone_book_substr ;
-- fname | regexp_matches
-----------+----------------
-- Xxhdadj | {x}
--(1 row)
select DISTINCT fname, regexp_matches(fname, '(x){3}','i') from phone_book_substr ;
-- fname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, '(c){2}','i') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Ccjgahd | {c}
-- Cckgahd | {c}
-- Cclgahd | {c}
-- Ccmgahd | {c}
-- Ccngahd | {c}
-- Ccogahd | {c}
-- Ccpgahd | {c}
-- Ccqgahd | {c}
-- Ccrgahd | {c}
--(9 rows)
-----------------------------------------------------------------------
--Constraints
-----------
--re - Regular Expression.
--Constraint Description
--------------------------------------------------------------------------
-- ^ matches at the beginning of the string
-- $ matches at the end of the string
-- (?=re) positive lookahead matches at any point where a substring matching
-- re begins (AREs only)
-- (?!re) negative lookahead matches at any point where no substring matching
-- re begins (AREs only)
-----------------------------------------------------------------------
select DISTINCT lname, regexp_matches(lname, '^z', 'i') from phone_book_substr order by lname;
-- lname | regexp_matches
-----------+----------------
-- Zadgahd | {Z}
-- Zbegahd | {Z}
--..............
-- Zdygahd | {Z}
-- Zdzgahd | {Z}
--(23 rows)
select DISTINCT lname, regexp_matches(lname, '$z', 'i') from phone_book_substr;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, 'z$') from phone_book_substr;
-- lname | regexp_matches
-------+----------------
--(0 rows)
select DISTINCT lname, regexp_matches(lname, 'd$') from phone_book_substr order by lname;
-- lname | regexp_matches
---------+----------------
-- Aadgahd | {d}
-- Abegahd | {d}
-- Abfgahd | {d}
--................
-- Zdygahd | {d}
-- Zdzgahd | {d}
--(644 rows)
--
--(?=re) positive lookahead matches at any point where a substring matching
-- re begins (AREs only)
--select DISTINCT lname, regexp_matches(lname, '(?=zd)', 'i') from phone_book_substr;
-- lname | regexp_matches
-----------+----------------
-- Zdsgahd | {""}
-- Zdtgahd | {""}
-- Zdugahd | {""}
-- Zdvgahd | {""}
-- Zdwgahd | {""}
-- Zdxgahd | {""}
-- Zdygahd | {""}
-- Zdzgahd | {""}
--(8 rows)
--select DISTINCT lname, regexp_matches(lname, '(?=wg)', 'i') from phone_book_substr;
-- lname | regexp_matches
-----------+----------------
-- Adwgahd | {""}
-- Bdwgahd | {""}
--................
-- Xdwgahd | {""}
-- Ydwgahd | {""}
-- Zdwgahd | {""}
--(28 rows)
--select DISTINCT lname, regexp_matches(lname, '(?=Ad)', 'i') from phone_book_substr;
-- lname | regexp_matches
-----------+----------------
-- Aadgahd | {""}
-- Adsgahd | {""}
-- Adtgahd | {""}
--................
-- Yadgahd | {""}
-- Zadgahd | {""}
--(32 rows)
--
--
--(?!re) negative lookahead matches at any point where no substring matching
-- re begins (AREs only)
--select DISTINCT lname, regexp_matches(lname, '(?!Ad)', 'i') from phone_book_substr;
-- lname | regexp_matches
-----------+----------------
-- Aadgahd | {""}
-- Abegahd | {""}
--...............
-- Zdygahd | {""}
-- Zdzgahd | {""}
--(644 rows)
--select DISTINCT lname, regexp_matches(lname, '(?!hd)', 'i') from phone_book_substr;
-- lname | regexp_matches
-----------+----------------
-- Aadgahd | {""}
-- Abegahd | {""}
--...............
-- Zdxgahd | {""}
-- Zdygahd | {""}
-- Zdzgahd | {""}
--(644 rows)
-----------------------------------------------------------------------
-----------------------------------------------------------------------
--where substring(lname from '%\\"yg\\"%' for '\\') IS NOT NULL
--;
-----------------------------------------------------------------------
-- Function regexp_split_to_table returns all the captured substrings
-- that match with the pattern.
-- select regexp_split_to_table(string, pattern [,flags])');
-- this function splits a string using a POSIX regular expression
-- pattern as a delimiter.
select foo from regexp_split_to_table('the quick brown fox jumped over the lazy dog',E'\\\s+') AS foo;
SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo;
-----------------------------------------------------------------------
----------------------------------------------------------
---substring(string from pattern for escape character)
-- provides extraction of a substring that matches a SQL
-- regular expression. To indicate the part of the pattern
-- that should be returned on success, the pattern must
-- contain two occurrences of the escape character
-- followed by a double quote ("). The
-- text matching the portion of the pattern between these markers
-- is returned.
----------------------------------------------------------
select substring('foobar' from 'foo');
--returns foo
select substring('foobar' from 'oba');
--returns oba
select substring('foobar' from 'oo%');
--returns nothing
--select substring('foobar' from '%"o_b#"%' for '#');
--returns nothing
select substring('foobar' from '%#"o_b#"%' for '#');
--returns oob
select count(substring(lname from '%#"o_b#"%' for '#'))
from phone_book_substr;
--0
select count(substring(lname from '%#"Ab#"%' for '#'))
from phone_book_substr;
--135
select substring(lname from '%#"Ab#"%' for '#')
from phone_book_substr
where substring(lname from '%#"Ab#"%' for '#') IS NOT NULL;
--returns 'Ab' 135 times.
select substring(lname from '%#"Zd#"%' for '#')
from phone_book_substr
where substring(lname from '%#"Zd#"%' for '#') IS NOT NULL
;
--returns 'Zd' 216 times.
select substring(lname from '%#"Z_k#"%' for '#')
from phone_book_substr
where substring(lname from '%#"Z_k#"%' for '#') IS NOT NULL
;
--returns 'Zck' 27 times.
select lname, substring(lname from '%#"Z_y#"%' for '#')
from phone_book_substr
where substring(lname from '%#"Z_y#"%' for '#') IS NOT NULL
;
-- returns 27 rows.
-- lname | substring
---------+-----------
-- Zdygahd | Zdy
select lname, substring(lname from '%#"Z_yg_h#"%' for '#')
from phone_book_substr
where substring(lname from '%#"Z_yg_h#"%' for '#') IS NOT NULL
;
-- returns 27 rows.
-- lname | substring
---------+-----------
-- Zdygahd | Zdy
--select lname, substring(lname from '%\\"Z_yg_h\\"%' for '\\')
--from phone_book_substr
--where substring(lname from '%\\"Z_yg_h\\"%' for '\\') IS NOT NULL
--;
-- returns 27 rows.
-- lname | substring
---------+-----------
-- Zdygahd | Zdy
--select DISTINCT lname, substring(lname from '%\\"__yg_h\\"%' for '\\')
--from phone_book_substr
--where substring(lname from '%\\"__yg_h\\"%' for '\\') IS NOT NULL
--;
--dygahd | Adygah
-- Bdygahd | Bdygah
-- Cdygahd | Cdygah
-- Ddygahd | Ddygah
-- Edygahd | Edygah
-- Fdygahd | Fdygah
-- Gdygahd | Gdygah
-- Hdygahd | Hdygah
-- Idygahd | Idygah
-- Jdygahd | Jdygah
-- Kdygahd | Kdygah
-- Keygahd | Keygah
-- Ldygahd | Ldygah
-- Liygahd | Liygah
-- Mdygahd | Mdygah
-- Moygahd | Moygah
-- Ndygahd | Ndygah
-- Nuygahd | Nuygah
-- Odygahd | Odygah
-- Pdygahd | Pdygah
-- Rdygahd | Rdygah
-- Sdygahd | Sdygah
-- Udygahd | Udygah
-- Gdygahd | Gdygah
-- Hdygahd | Hdygah
-- Idygahd | Idygah
-- Jdygahd | Jdygah
-- Kdygahd | Kdygah
-- Keygahd | Keygah
-- Ldygahd | Ldygah
-- Liygahd | Liygah
-- Mdygahd | Mdygah
-- Moygahd | Moygah
-- Ndygahd | Ndygah
-- Nuygahd | Nuygah
-- Odygahd | Odygah
-- Pdygahd | Pdygah
-- Rdygahd | Rdygah
-- Sdygahd | Sdygah
-- Udygahd | Udygah
-- Vdygahd | Vdygah
-- Wdygahd | Wdygah
-- Xdygahd | Xdygah
-- Ydygahd | Ydygah
-- Zdygahd | Zdygah
select count(*)
from phone_book_substr
;
--17388
---------------------------------------------------------
select lname_substr
from phone_book_substr
where lname_substr LIKE 'Aa' group by 1 order by 1;
--0 Rows.
select lname_substr
from phone_book_substr
where lname_substr LIKE 'A%' group by 1 order by 1;
select count(*)
from phone_book_substr
where lname_substr LIKE 'A%';
--621
select lname_substr
from phone_book_substr
where lname_substr LIKE '_a_' group by 1 order by 1;
select lname_substr
from phone_book_substr
where lname_substr LIKE '_Z_' group by 1 order by 1;
--0 Rows.
select lname_substr
from phone_book_substr
where lname_substr LIKE 'Abd' group by 1 order by 1;
--0 Rows.
-- ~~ is equivalent to LIKE
select count(*)
from phone_book_substr
where lname_substr ~~ 'A%';
--621
select count(*)
from phone_book_substr
where lname_substr ~~ '_b_';
--3240
-- ILIKE case sensitive LIKE
select count(*)
from phone_book_substr
where lname_substr ILIKE 'a%';
-- ~~* is equivalent to ILIKE
select count(*)
from phone_book_substr
where lname_substr ~~* 'a%';
--621
select count(*)
from phone_book_substr
where lname_substr ~~* '_b_';
--3240
-- NOT LIKE
select lname_substr
from phone_book_substr
where lname_substr NOT LIKE 'Z%' group by 1 order by 1;
-- !~~ is equivalent to NOT LIKE
select count(*)
from phone_book_substr
where lname_substr !~~ 'A%';
--16767
select count(*)
from phone_book_substr
where lname_substr !~~ '_A%';
--17388
select count(*)
from phone_book_substr
where lname_substr !~~ '_b%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~ '_B%';
--17388
select count(*)
from phone_book_substr
where lname_substr !~~ '_b%';
--14148
-- !~~* is equivalent to NOT ILIKE
select count(*)
from phone_book_substr
where lname_substr !~~* 'a%';
--16767
select count(*)
from phone_book_substr
where lname_substr !~~* '_A%';
--16740
select count(*)
from phone_book_substr
where lname_substr !~~* '_b%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~* '_B%';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~* '_B_';
--14148
select count(*)
from phone_book_substr
where lname_substr !~~* '_b_';
--14148
-- ARRAY
--select array(select fname
-- from phone_book_substr
-- where lname_substr LIKE '%y%');
select lname_substr
from phone_book_substr
where lname_substr similar to '(A|B)%' group by 1 order by 1;
select lname_substr
from phone_book_substr
where lname_substr similar to '(A|B)%' group by 1 order by 1;
--select array(select fname
-- from phone_book_substr
-- where lname_substr like '%y%');
select lname_substr
from phone_book_substr
where lname_substr like 'A%' group by 1 order by 1;
select lname_substr
from phone_book_substr
where lname_substr similar to '(A|B)%' group by 1 order by 1;
drop table phone_book;
drop table phone_book_substr;