我在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,那将是非常好的列。这样,解决方案可以在添加新列时进行扩展。答案 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%'
以过滤您要搜索的列。