【问题标题】:How do I name the output column in a sqlite values clause?如何在 sqlite 值子句中命名输出列?
【发布时间】:2022-03-14 21:57:55
【问题描述】:

如果我在 sqlite3 (3.17.0) 中运行此查询

select T.* from (values (1),(2),(3),(4),(5)) as T;

我得到以下输出,其中 T 的第一列没有名称。

----------
1
2
3
4
5

如何给 T 的第一列命名/别名,或者,有什么方法可以通过索引以某种方式引用它?

【问题讨论】:

    标签: sqlite


    【解决方案1】:
    with cte(my_column_alias) as 
      (values (1),(2),(3),(4),(5))
    select * from cte;
    

    【讨论】:

    • 完美。正是我当时所需要的。现在,如果我能记住我需要它做什么就好了。 :|
    • 别担心!再过一年,你会再次需要它,你会忘记你曾经问过这个问题或得到过答案,你会在网络搜索时遇到这个,你甚至不会一开始注意到它是你自己的问题。至少,这对我来说是这样的。
    • 这可能会更短:with cte(my_column_alias) as (values (1),(2),(3),(4),(5)) select * from cte;
    【解决方案2】:

    VALUES form of a query 没有任何机制让您指定列名。 (VALUES 子句旨在用于 CTE 或视图中,您可以在其中指定列名。)

    事实上,VALUES 返回的列确实有名称(但它们没有记录):

    sqlite> .header on sqlite> .mode 列 sqlite>值(42); 第 1 列 ---------- 42

    无论如何,即使该名称在子查询中不存在,空列名称也完全没有问题:

    select "" from (values (1),(2),(3),(4),(5));
    

    要应用列名,请在其周围加上 CTE:

    WITH T(my_column) AS (
      VALUES (1),(2),(3),(4),(5)
    )
    SELECT * FROM T;
    

    或使用compound queryWHERE 0 抑制来自第一个查询的行):

    SELECT NULL AS my_column WHERE 0
    UNION ALL
    VALUES (1),(2),(3),(4),(5);
    

    【讨论】:

    • 尽管当设置了.header on 时sqlite3 会打印column1,但该列仍未命名。 select column1 from (values (1)) 不起作用。
    • @MahmoudAl-Qudsi 正如我所提到的,子查询以某种方式删除了该名称。
    • 使用空列名“”不再适用于 SQLite 3.20.0。
    • 我看到名为“”、“:1”、“:2”等的列......除非它在触发器中,在这种情况下,只有常量列才会像这样编号
    • @MahmoudAl-Qudsi 除非我弄错了,点命令.header 与 sqlite3 的编译指示(或行为)无关,它只是关于显示(显示\隐藏)的设置您正在运行它的应用程序(sqlite3 cli)的上下文中的列名。编辑:我认为需要澄清。您是否尝试专门为该列添加别名? select column1 as new_column from (values (1))?
    【解决方案3】:
    select 1 a union all 
    select T.* from (values (1),(2),(3),(4),(5)) as T;
    
    a
    ---
    1
    1
    2
    3
    4
    5
    

    小技巧,现在你有了a列

    【讨论】:

      【解决方案4】:

      虽然我推荐 @Catherine 提供的 CTE 答案 - 因为它不仅在某些情况下似乎比我将提供的答案更快,而且鼓励与可重用性和单一责任等原则相关的开发模式和方法。

      虽然这个答案(可能是所有这些答案)取决于PRAGMA 设置(我目前没有足够的知识来涵盖),但似乎可以同时引用生成的列名和别名他们。

      即生成VALUES表的列,列标题为:column1column2等;因此,您只需通过显式引用生成的特定列名来为列命名。

      SELECT
         v.[column1] [Id]
        ,v.[column2] [Name]
      FROM (VALUES (1, 'Alex'), (2, 'Brad'), (3, 'Mary'), (4, 'Jennifer')) [v]
      
      

      【讨论】:

        【解决方案5】:

        根据SQLite documentation

        短语“VALUES(expr-list)”的含义与“SELECT expr-list”。短语“VALUES(expr-list-1),...,(expr-list-N)”表示 与“SELECT expr-list-1 UNION ALL ... UNION ALL SELECT”相同 expr-list-N"。

        所以,你可以改成:

        SELECT T.a AS my_column_alias FROM (
         SELECT 1 as a
         UNION ALL
         SELECT 2 as a
         UNION ALL
         SELECT 3 as a
         UNION ALL
         SELECT 4 as a
         UNION ALL
         SELECT 5 as a
        ) as T;
        

        那么“my_column_alias”就是你的列名/别名。

        my_column_alias
        ---------------
        1
        2
        3
        4
        5
        

        【讨论】:

          猜你喜欢
          • 2021-12-02
          • 1970-01-01
          • 2018-08-17
          • 2019-11-28
          • 1970-01-01
          • 1970-01-01
          • 2022-09-30
          • 1970-01-01
          • 2019-07-13
          相关资源
          最近更新 更多