【问题标题】:Searching through hundreds of columns without naming them?搜索数百列而不命名它们?
【发布时间】:2016-07-21 10:17:50
【问题描述】:

我正在通过 SAS 访问 SQL,我正在搜索一个表,其中的列命名如下:

a1   a2   a3   ...  a500  b1    ...  b500
1022 1025 1184      1011  1085       1542
1965 1547 1242      1354  1874       1745

我正在尝试在 a* 列中的任意位置查找具有两个单独代码的行,如下所示:

where (a1...a500) like 1022 and (a1...a500) like 1184

如何在不命名的情况下搜索所有这些列?

【问题讨论】:

  • 您是如何访问 SQL 的?例如 Pass-Through 或 Libname

标签: sql sas


【解决方案1】:

您可以使用WHICHN() 函数跨多个列查找值。

data want;
  set have;
  where whichn(1022, of a1-a500) and whichn(1184, of a1-a500);
run;

如果“SQL”是指您想使用 PROC SQL,那么这将不起作用,因为您不能在 PROC SQL 代码中使用变量列表。您可以在数据集选项中使用它。

proc sql ;
  create table want as
    select * 
    from have(where=(whichn(1022, of a1-a500) and whicn(1184, of a1-a500)))
  ;
quit;

如果“SQL”是指您的数据不在 SAS 数据集中,而是从远程数据库访问,我怀疑 SAS 是否可以将该 WHERE 子句推送到您的远程 SQL 数据库中。因此 SAS 需要将所有行拉到 SAS 才能应用过滤器。

【讨论】:

    【解决方案2】:

    您可以枚举列并生成一个包含其名称的列表。然后构造查询并将其传递给sp_executesql

    DECLARE @ColumnList NVARCHAR(1024) = '' -- Adjust the length as need
    
    SELECT @ColumnList = @ColumnList + COLUMN_NAME + ', ' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME like 'a%'
    
    SET @ColumnList = SUBSTRING(@ColumnList, 0, LEN(@ColumnList))
    
    --PRINT @ColumnList
    
    DECLARE @Sqltext NVARCHAR(1024) = 'SELECT * FROM YourTable WHERE (1022 IN (' + @ColumnList + ')) AND (1184 IN (' + @ColumnList + '))'
    
    --PRINT @SqlText
    
    EXEC sp_executesql @SqlText
    

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 2019-02-27
      • 2020-03-12
      • 2023-01-26
      • 2011-10-11
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2018-08-17
      相关资源
      最近更新 更多