【问题标题】:Oracle SQL - select column of explicitly defined valuesOracle SQL - 选择明确定义的值的列
【发布时间】:2019-12-02 22:12:08
【问题描述】:

假设我有一张这样的桌子:

我的表

Name  |  Age  
Jack     20
Joe      33
John     4
Bob      0

假设我想从 mytable 中选择所有行以及自定义值列:random : 'rabbit','wild', 'nuts'yielding:

Name  |  Age  |  random
Jack     20      rabbit
Joe      33      wild 
John     4       nuts
Bob      0       NULL

如何解决这个问题?

【问题讨论】:

  • 你从哪里得到这些值?
  • 最好手动键入作为查询语句的一部分
  • “手动键控”是什么意思?你有这些值的表格,一个函数吗?你想为每一行选择一个随机值吗?
  • Row_number() 两个集合和left join 数字。

标签: sql oracle


【解决方案1】:

你想要case 表达式?

select t.*, (case when age = 20 then 'rabbit' 
                  when age = 33 then 'wild' 
                  when age = 4 then 'nuts' 
             end) as random
from table t;

【讨论】:

  • 不,根本没有条件,我只是希望能够将值列表作为另一列作为select 的一部分传递,这可能吗?
【解决方案2】:

您可以使用dbms_random添加带有随机字符串的列

 CASE round(dbms_random.value(1,4)) 
        WHEN 1 THEN 'rabbit' 
        WHEN 2 THEN 'wild' 
        WHEN 3 THEN 'nuts' 
        WHEN 4 THEN null
   END AS random

[类似答案][2[

【讨论】:

    【解决方案3】:

    这更灵活一些,但也更复杂......

    WITH random AS (
      SELECT row_number() OVER (ORDER BY (1)) rank, val FROM (
        SELECT 'rabbit' AS val FROM DUAL
        UNION ALL
        SELECT 'wild' AS val FROM DUAL
        UNION ALL
        SELECT 'nuts' AS val FROM DUAL
        UNION ALL
        SELECT NULL AS val FROM DUAL
      )
      ORDER BY dbms_random.value
    ),
    myrows AS (
      SELECT row_number() OVER (ORDER BY (1)) rank, mytable.*
      FROM mytable
    )
    SELECT myrows.Name, myrows.Age, random.val
    FROM myrows
    LEFT JOIN random ON myrows.rank = random.rank;
    

    http://sqlfiddle.com/#!4/5f785d/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多