【问题标题】:Is there a way to remove '_' from column name while selecting * in sql statement?在 sql 语句中选择 * 时,有没有办法从列名中删除 '_'?
【发布时间】:2014-07-21 14:04:35
【问题描述】:

我的表有所有的列名 (有80多列,我现在不能更改列名) '_' 的格式。比如 First_Name、Last_Name、...

所以我想改用select * from table 使用 AS。

我想通过在一个语句中删除“_”来选择它们。反正我能做到吗? select 语句中的 Replace(coulmnName, '_','') 之类的东西?

谢谢

【问题讨论】:

  • 闲散的好奇心:AS 有什么问题?
  • 您可以更好地创建一个视图,然后使用 select * from view
  • 你不能在 SQL 中。你如何消费他的查询?你能在客户端更改列名吗?

标签: sql sql-server


【解决方案1】:

您可以简单地重命名查询中的列。例如:

SELECT FIRST_NAME [First Name],
       LAST_NAME [Last Name]
  FROM UserTable

您也可以使用AS 关键字,但这是可选的。另请注意,如果您不想对每个查询都执行此操作,则可以使用此过程创建一个包含重命名列的视图。然后你可以按照你想要的方式使用SELECT *(尽管出于多种原因,这被认为是bad idea)。

祝你好运!

替代方案 - 在客户端代码中映射:

另一种选择是在客户端代码中进行映射。该解决方案将很大程度上取决于您的 ORM。大多数 ORM(如 LINQ 或 EF)都允许您重新映射。如果没有别的,您可以使用 AutoMapper 或类似的方法使用基于约定的命名来重命名客户端上的列。

【讨论】:

  • 我在 Oracle 11 中使用 AS。您使用的是什么版本?
  • 但我不想在查询中明确声明 80+ 列名。还有什么办法吗?
  • 您可以生成您的 SQL 脚本 - 通过 select column_name from all_tab_columns where table_name = ...;然后使用文本编辑器和一些搜索和替换 - 或者你可以为此编写一个 pl/sql 例程......
  • @MichaelMcGriff 我在 9i 和 10g 上遇到了很多关于 AS 的问题。也就是说,我删除了评论,因为正式这应该适用于 oracle。
  • @drew_w 我在 11 日从来没有遇到过麻烦。+1 提到真正的问题是使用 SELECT *
【解决方案2】:

除非您使用动态 SQL,否则您无法在单个语句中执行此操作。如果你只是想生成代码,你可以对 Information_Schema 运行查询并获取你想要的信息......

DECLARE @MaxColumns INT
DECLARE @TableName VARCHAR(20)
SET @TableName = 'Course'
SELECT @MaxColumns = MAX(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName 


SELECT Col 
FROM 
  (
    SELECT 0 Num, 'SELECT' Col
    UNION
    SELECT ROW_NUMBER() OVER (PARTITION BY TABLE_NAME ORDER BY ORDINAL_POSITION) Num, ' [' + COLUMN_NAME + '] AS [' + REPLACE(COLUMN_NAME, '_', '') + ']' + CASE WHEN ORDINAL_POSITION = @MaxColumns THEN '' ELSE ',' END
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @TableName
    UNION 
    SELECT @MaxColumns + 1 Num, 'FROM ' + @TableName 
  ) s 
ORDER BY num 

【讨论】:

  • 如果你有多个模式,当然,你需要为正确的一个添加一个过滤器......
【解决方案3】:

这个问题引起了我的兴趣,我确实找到了一种方法。它可以实现,但是如果您只想在一个查询中一次性提供很多别名,我不推荐它。

首先我创建了一个存储过程,它提取所有列名并给它们一个不带“_”的别名。

USE [DataBase]
GO
IF OBJECT_ID('usp_AlterColumnDisplayName', 'P') IS NOT NULL
    DROP PROCEDURE usp_AlterColumnDisplayName
GO

CREATE PROCEDURE usp_AlterColumnDisplayName 
@TableName VARCHAR(50)
,
@ret nvarchar(MAX) OUTPUT
AS

Select @ret = @ret + [Column name]
From
(
    SELECT ([name] + ' AS ' + '[' + REPLACE([name], '_', ' ') + '], ') [Column name]
    FROM syscolumns
    WHERE id =
        (Select id
        From sysobjects
        Where type = 'U'
        And [name] = @TableName
    )
) T
GO

然后提取该字符串并将其放入具有查询结构的另一个字符串中。

执行,你就完成了。

DECLARE @out NVARCHAR(MAX), @DesiredTable VARCHAR(50), @Query NVARCHAR(MAX)
SET @out = ''
SET @DesiredTable = 'YourTable'
EXEC usp_AlterColumnDisplayName 
    @TableName = @DesiredTable,
    @ret = @out OUTPUT
SET @out = LEFT(@out, LEN(@out)-1) --Removing trailing ', '

SET @Query = 'Select ' + @out + ' From ' + @DesiredTable + ' WHERE whatever'

EXEC sp_executesql @Query

如果您只是想一次提供很多别名,而不是坐下来为 80 多列输入,我宁愿建议使用一个简单的 SELECT 语句来执行此操作,例如 sp 或 Excel 中的语句和然后复制粘贴到你的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2019-10-11
    相关资源
    最近更新 更多