选择一组列值不为空的所有行

时间:2015-02-18 08:46:47

标签: sql oracle

我在Oracle中有一个复杂的表,故意不进行规范化。它有大量的列,每个列都有观察值

类似

表1 ID,obs1,obs2,obs2,obs3 ... obs100

有没有办法选择所有行,其中所有的ob列都不为空且ID> 100?

在Oracle

中获取列名称很容易
SELECT DISTINCT COLUMN_NAME
                            FROM   ALL_TAB_COLS, Table1 
                            WHERE  table_name = 'Table1 '
                            AND  COLUMN_NAME LIKE 'Obs%'  ;

但是我怎样才能将它与这样的东西结合起来(伪代码,因为下面当然不起作用):

select * from Table1 Where ColName in ( SELECT DISTINCT COLUMN_NAME
                            FROM   ALL_TAB_COLS, Table1 
                            WHERE  table_name = 'Table1 '
                            AND  COLUMN_NAME LIKE 'obs%' ) 
And ColName.Value is Not Null and Table1.Id >100;

我知道我可以使用动态sql设置查询,但是可以使用某种转置技巧来获得结果。如果有简单的查询,我宁愿不使用PL-SQL。

编辑:提出VIEW的解决方案很聪明:)我应该补充一点,我想避免添加视图,此外,如果我不必通过使用类似的select作为我的选择来枚举cols,那将是非常好的列。这样,解决方案可以在添加新列时进行扩展。

2 个答案:

答案 0 :(得分:1)

你可以创建一个将所有列连接在一起的视图,所以如果这个列为null,那么你知道它们都是空的(位杂乱,但理论上会起作用)。您也可以使用CALCULATED列功能,但我不确定这是否允许使用非数字字段

戴夫

答案 1 :(得分:1)

您可以使用 xmlquery 在SQL中执行此操作。

例如,

我想在整个KING架构中的所有表格所有列中搜索值SCOTT

SQL> variable val varchar2(10)
SQL> exec :val := 'KING'

PL/SQL procedure successfully completed.

SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
  2    SUBSTR (table_name, 1, 14) "Table",
  3    SUBSTR (column_name, 1, 14) "Column"
  4  FROM cols,
  5    TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
  6    || column_name
  7    || ' from '
  8    || table_name
  9    || ' where upper('
 10    || column_name
 11    || ') like upper(''%'
 12    || :val
 13    || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
 14  ORDER BY "Table"
 15  /

Searchword  Table          Column
----------- -------------- --------------
KING        EMP            ENAME

SQL>

我已经展示了几个例子here

在您的情况下,添加过滤器AND COLUMN_NAME LIKE 'obs%'以过滤您要搜索的列。