【问题标题】:automatically selecting databasis and columns and searching data自动选择数据库和列并搜索数据
【发布时间】:2013-08-02 10:49:36
【问题描述】:

是否可以编写一个查询,自动从 Teradata 的 dbc.Columns 表中选择所有数据库名称和列名称,并搜索一组特定的值?

一组值:

WHERE abc in (1,2,3)

选择 dbc.columns:

SELECT DatabaseName, TableName FROM dbc.COLUMNS
WHERE ColumnName LIKE '%abc%'

我怎样才能将它结合起来并进行一个查询,该查询将只返回那些 DatabaseName 和 TableName 的组合,其中 ColumnName 具有特定的值子集?

更新:

此查询查找所有数据库 - 列组合:

SELECT TRIM(BOTH FROM a.DatabaseName) || '.' || TRIM( BOTH FROM a.TableName)
FROM dbc.COLUMNS AS a
WHERE ColumnName LIKE '%abc%'

是否可以定义一些变量或某种东西。还有吗?

【问题讨论】:

    标签: metadata teradata


    【解决方案1】:

    您需要编写动态 SQL 语句,例如

    SELECT 
       'SELECT ''' || DatabaseName || '.' || TableName || '.' || ColumnName || ''''
       ' WHERE EXISTS (SELECT * FROM ' || DatabaseName || '.' || TableName ||
       ' WHERE ' || ColumnName || ' IN (1,2,3));' 
    FROM dbc.ColumnsVX
    WHERE ColumnName LIKE '%abc%';
    

    运行生成的查询将返回一个结果集,每个表包含零行或一行。

    要获得单个结果集,您需要在 dbc.columnsVX 结果上编写一个带有游标的存储过程(添加一个 INSERT INTO 临时表),立即执行每一行。最后返回 temptable 的行。

    除非您是经验丰富的 SQL 程序员,否则您的 DBA 不会授予您创建 SP 的权利。

    但是为什么你真的需要这种信息呢?大海捞针?

    【讨论】:

    • 感谢您的回答;是的,这是大海捞针中的一根针 :) 事情在“IN”部分我有字符串,我在转义 ' 特殊字符时遇到了麻烦。你能帮帮我吗?
    • 另外,我还会使用 TRIM( BOTH FROM ... ) 函数
    • 使用 dbc.ColumnsV[X] 时不需要 TRIM,因为名称是 VARCHAR 与 dbc.Columns[X] 中的 CHAR。
    • 关于 LIKE 的“特殊字符”只有两个,通配符“_”和“%”。如果您需要搜索使用 LIKE '...' ESCAPE '.' 的字符,则转义字符后的字符不再是通配符。例如。 LIKE '%_%\%%' ESCAPE '\' 搜索任意数量的字符,后跟下划线,后跟任意数量的字符,后跟百分号,后跟任意数量的字符
    • IN 的特殊字符只能是单引号:字符串中的单引号必须加倍,例如'在哪里' ||列名 || 'IN(''1'',''2'',''3''));'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多