【问题标题】:How to select several hardcoded SQL rows?如何选择几个硬编码的 SQL 行?
【发布时间】:2011-09-14 19:05:46
【问题描述】:

如果你执行这个查询

SELECT 'test-a1' AS name1, 'test-a2' AS name2

结果将是单行选择,其中两列具有这些值:

test-a1, test-a2

如何修改上述查询以选择多行,例如

test-a1, test-a2
test-b1, test-b2
test-c1, test-c2

我知道如何使用 UNION 来做到这一点,但我觉得有一种更简单的方法来做到这一点。

PS。抱歉,问了这么一个基本问题,google 太难了。

【问题讨论】:

  • 你有一张桌子可以选择吗?
  • 您是否有不想使用联合的原因?是否存在大量值?

标签: mysql sql oracle


【解决方案1】:

UNION ALL 是最好的选择。它比 UNION 更快,并且您将拥有互斥的行。

【讨论】:

  • 这是对我帮助最大的 Oracle 答案(请注意,也有针对字符串而不是数字的解决方案,请查看我的评论):stackoverflow.com/questions/10353969/…
  • @HLGEM 相反,UNION ALL 生成重复行,而 UNION 生成互斥行。
【解决方案2】:

我很想知道是否有人有更好的解决方案。过去我用过这个:

Select top 3 'Hardcode'
from tableWithLotsOfRows

你介意把 abc 换成 123 吗?

select top 3 
    'test-A'+convert(varchar, row_number() over (order by PrimaryKey)),
    'test-B'+convert(varchar, row_number() over (order by PrimaryKey))
from tableWithLotsOfRows

应该返回类似:

TestA1, Test-B1
TestA2, Test-B2
TestA3, Test-B3

【讨论】:

  • 这是一个MySQL问题,所以没有排名功能。但好主意!
  • 这太糟糕了。在 t-sql 中,我滥用了 row_number()。
【解决方案3】:

以下内容适用于 SQL:

SELECT 'test-a1' AS name1, 'test-a2' AS name2 
UNION ALL 
SELECT 'test-b1', 'test-b2'
UNION ALL 
SELECT 'test-c1', 'test-c2'

【讨论】:

    【解决方案4】:

    您可以使用临时表,将结果填入其中,然后从中进行选择

    create table #tmpAAA (name1 varchar(10), name2 varchar(10))
    insert into #tmpAAA (name1, name2) 
    values ('test_a', 'test_b'),
           ('test_c', 'test_d'),
           ('test_e', 'test_f'),
           ('test_g', 'test_h'),
           ('test_i', 'test_j');
    select * from #tmpAAA;
    

    这将返回

    name1   name2
    ==================
    test_a  test_b
    test_c  test_d
    test_e  test_f
    test_g  test_h
    test_i  test_j
    

    【讨论】:

      【解决方案5】:

      Values 关键字可以如下使用。

      select * from 
      (values ('test-a1', 'test-a2'), ('test-b1', 'test-b2'), ('test-c1', 'test-c2')) x(col1, col2)
      

      【讨论】:

      • UNION ALL 答案比这个更受欢迎有什么原因吗?
      • 这段代码 sn-p 不能在 MuSQL 5.6.25 中运行。它是 5.7 中的新功能吗?
      • 这个例子在我的 MS SQL Server 中运行良好,但在 Oracle 中却不行。
      • 在 10.6.4-MariaDB-1:10.6.4+maria~focal-log 上返回语法错误
      【解决方案6】:

      为 oracle 扩展 answer of @openshac,因为下面提到的代码适用于 oracle:

      SELECT 'test-a1' AS name1, 'test-a2' AS name2 from dual 
      UNION ALL 
      SELECT 'test-b1', 'test-b2' from dual
      UNION ALL 
      SELECT 'test-c1', 'test-c2' from dual
      

      【讨论】:

        【解决方案7】:

        在 MySQL 中,您可以像这样使用UNION

        SELECT * from 
            (SELECT 2006 AS year UNION
             SELECT 2007 AS year UNION
             SELECT 2008 AS year UNION
            ) AS years
        

        【讨论】:

        • 不需要最终的 UNION
        【解决方案8】:

        从 MySQL 8.0.19 开始,可以这样做

        选择 column_0 AS 名称 1, column_1 AS 名称2 从 (价值观 行('test-a1','test-a2'), 行('test-b1','test-b2'), 行('test-c1','test-c2') ) AS 硬编码名称

        返回

        名称 1 名称 2 =================== 测试-a1 测试-a2 测试-b1 测试-b2 测试-c1 测试-c2

        关于列名的注释

        从 VALUES 输出的表的列具有隐式命名的列 column_0、column_1、column_2 等,始终以 0 开头。

        此处的文档:https://dev.mysql.com/doc/refman/8.0/en/values.html

        【讨论】:

          【解决方案9】:

          以下代码在 MSSQL 环境中适用于我:

          SELECT Name1,Name2 FROM(VALUES  ('test-a1', 'test-a2'),
                                             ('test-b1', 'test-b2'),
                                             ('test-c1', 'test-c2'))AS Test(Name1,Name2)
          

          输出:

          Name1   Name2
          ------- -------
          test-a1 test-a2
          test-b1 test-b2
          test-c1 test-c2
          

          【讨论】:

            猜你喜欢
            • 2014-03-06
            • 1970-01-01
            • 1970-01-01
            • 2017-08-27
            • 2018-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多