【问题标题】:select columns that don't contain a pattern in a table in SQL在 SQL 的表中选择不包含模式的列
【发布时间】:2021-01-18 09:15:09
【问题描述】:

我想选择所有不包含模式“acc”的列。

这段代码是我写的

select (
select COLUMN_NAME  from  information_schema.columns 
where table_name='output_bba'
    and column_name not like 'acc%') 
    from ifrs17.output_bba

但我收到此错误消息:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你在上面到底想做什么,子查询似乎就是你所需要的;为什么你有外部的SELECTFROM
  • 您似乎正在尝试从您想要获取的列名称中进行选择。您不能直接执行此操作。将列名读入变量。然后为动态SQL生成一个字符串,然后执行。
  • 另外,你不明白的错误呢?问题是什么非常明确;您的子查询返回多个值(在 case 行中),并且在使用它的上下文中(作为表达式)是不允许的。
  • SQL中数据和对象(标识符)性质不同,不能混用。只需粘贴直接列名。一些 DBMS 允许您按模式选择列,但在 SQL Server 中,没有动态 SQL 是不可能的。
  • @Nassim 你应该学习一些 SQL 教程,在那里你将学习如何编写 SQL 语句。您尝试解决的任务(动态列名)的工作方式不同,因为 SQL 以不同的方式设计。

标签: sql sql-server select


【解决方案1】:

您正在尝试从动态获取的列中进行选择。试试这个:

Declare @Cols varchar(max)
Select @Cols=Stuff((Select ','+COLUMN_NAME from information_schema.columns Where table_name='output_bba' and column_name not like 'acc%' For XML Path('')),1,1,'')

Declare @SQL nvarchar(max)
Set @SQL='Select '+@Cols+' From ifrs17.output_bba';

Execute sp_executesql @SQL;

【讨论】:

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