Reputation: 3
I am trying to insert rows made from random values in a table 'Users' where the the email is dependent on the value of the username:
The row 'username' is not seen by the last SELECT query (doesn't exist)
How can i fix this?
SELECT(
SELECT
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as username
from (values('abcdefghijklmnopqrstuvwxyz0123456789')) as symbols(characters) join generate_series(1, 15) on 1 = 1
UNION
SELECT
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as password
from (values('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*')) as symbols(characters) join generate_series(1, 15) on 1 = 1
UNION
SELECT
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as phonenumber
from (values('0123456789')) as symbols(characters) join generate_series(1, 9) on 1 = 1
UNION
SELECT
(username || '@' || (
CASE (RANDOM() * 2)::INT
WHEN 0 THEN 'gmail'
WHEN 1 THEN 'hotmail'
WHEN 2 THEN 'yahoo'
END
) || '.com') AS email
) INTO "User" from generate_series(1,10000)
This also doesn't work:
SELECT(
SELECT
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as username
from (values('abcdefghijklmnopqrstuvwxyz0123456789')) as symbols(characters) join generate_series(1, 15) on 1 = 1
UNION
SELECT
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as password
from (values('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')) as symbols(characters) join generate_series(1, 15) on 1 = 1
as select1
UNION
SELECT
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as phonenumber
from (values('0123456789')) as symbols(characters) join generate_series(1, 9) on 1 = 1
UNION
SELECT
(select1.username || '@' || (
CASE (RANDOM() * 2)::INT
WHEN 0 THEN 'gmail'
WHEN 1 THEN 'hotmail'
WHEN 2 THEN 'yahoo'
END
) || '.com') AS email
) INTO "User" from generate_series(1,10000)
Upvotes: 0
Views: 58
Reputation: 107632
Consider a recursive CTE query and removing subqueries for top level columns:
WITH RECURSIVE main AS
(
SELECT
string_agg(substr(shortchars, (random() * length(shortchars) + 1)::integer, 1),'') AS "username"
, string_agg(substr(longchars, (random() * length(longchars) + 1)::integer, 1), '') AS "password"
, substr(string_agg(substr(nums, (random() * length(nums) + 1)::integer, 1), ''),1,9) AS "phonenumber"
, 1 AS n
FROM (values('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*')) as longchars(longchars)
CROSS JOIN (values('abcdefghijklmnopqrstuvwxyz0123456789')) as shortchars(shortchars)
CROSS JOIN (values('0123456789')) as num(nums)
CROSS JOIN generate_series(1, 15)
UNION ALL
SELECT
string_agg(substr(shortchars, (random() * length(shortchars) + 1)::integer, 1),'') AS "username"
, string_agg(substr(longchars, (random() * length(longchars) + 1)::integer, 1), '') AS "password"
, substr(string_agg(substr(nums, (random() * length(nums) + 1)::integer, 1), ''),1,9) AS "phonenumber"
, n + 1
FROM (values('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*')) as longchars(longchars)
CROSS JOIN (values('abcdefghijklmnopqrstuvwxyz0123456789')) as shortchars(shortchars)
CROSS JOIN (values('0123456789')) as num(nums)
CROSS JOIN generate_series(1, 15)
CROSS JOIN (SELECT n FROM main LIMIT 1) AS mn
WHERE n < 10
GROUP BY mn.n
)
SELECT CONCAT(main."username",
'@',
( CASE (RANDOM() * 2)::INT
WHEN 0 THEN 'gmail'
WHEN 1 THEN 'hotmail'
WHEN 2 THEN 'yahoo'
END ),
'com') AS email
, main."username"
, main."password"
, main."phonenumber"
FROM main
Upvotes: 2