【问题标题】:How to use the value from one select query into another in union?如何将一个选择查询中的值用于联合中的另一个?
【发布时间】:2020-03-21 22:02:01
【问题描述】:

我正在尝试在“用户”表中插入由随机值组成的行,其中电子邮件取决于用户名的值:

最后一个 SELECT 查询没有看到“用户名”行(不存在)

我该如何解决这个问题?

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)

这也行不通:

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)

【问题讨论】:

  • 你根本做不到。

标签: sql postgresql


【解决方案1】:

考虑递归 CTE 查询并删除顶级列的子查询:

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

Online Demo

【讨论】:

  • 这很接近,但它一次只生成一行。最初的问题是尝试插入 1,000 个随机行。
  • 查看使用递归 CTE 的更新解决方案和演示。此外,顶级列的子查询。
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多