针对另一个表验证存储为 CSV 的列数据

Posted

技术标签:

【中文标题】针对另一个表验证存储为 CSV 的列数据【英文标题】:Validating Column Data Stored as CSV Against Another Table 【发布时间】:2010-03-08 14:33:12 【问题描述】:

我想看看一些建议的方法是针对包含适当值的表验证存储为 CSV 的字段。尽管这是需要的,但将 CSV 列表拆分为另一个相关表不是一个选项。在下面的示例数据中,我将尝试捕获小部件 A 的代码 99。

下面是一个示例数据表示。

Table: Widgets

WidgetName   WidgetCodeList
A            1, 2, 3
B            1
C            2, 3
D            99

Table: WidgetCodes

WidgetCode  
1
2
3

早期的方法是使用各种字符串操作和 CONNECT_BY_LEVEL 将 CSV 列查询为行,但性能不可接受。

【问题讨论】:

【参考方案1】:

您可以尝试使用流水线函数(此处使用横向连接):

SQL> WITH widgets AS (
  2     SELECT 'A' WidgetName, '1, 2, 3' WidgetCodeList FROM dual
  3     UNION ALL SELECT 'B', '1' FROM DUAL
  4     UNION ALL SELECT 'C', '2, 3' FROM DUAL
  5     UNION ALL SELECT 'D', '99' FROM DUAL
  6  ), widgetcodes AS (
  7     SELECT ROWNUM widgetcode from dual CONNECT BY LEVEL <= 3
  8  )
  9  SELECT w.widgetname,
 10         to_number(s.column_value) missing_widget
 11    FROM widgets w
 12         CROSS JOIN TABLE(demo_pkg.string_to_tab(w.WidgetCodeList)) s
 13   WHERE NOT EXISTS (SELECT NULL
 14                       FROM widgetcodes ws
 15                      WHERE ws.widgetcode = to_number(s.column_value));

WIDGETNAME MISSING_WIDGET
---------- --------------
D                      99

有关将字符串转换为表格的流水线函数示例,请参阅this other SO。

【讨论】:

【参考方案2】:

在 PL/SQL 中,您可以使用 Apex 实用程序将分隔字符串转换为 PL/SQL 集合,如下所示:

procedure validate_csv (p_csv varchar2)
is
   v_array apex_application_global.vc_arr2;
   v_dummy varchar2(1);
begin
   v_array := apex_util.string_to_table(p_csv, ', ');
   for i in 1..v_array.count
   loop
      begin
         select null
         into   v_dummy
         from   widgetcodes
         where  widgetcode = v_array(i);
      exception
         when no_data_found then
            raise_application_error('Invalid widget code: '||v_array(i));
      end;         
   end loop;
end;

【讨论】:

以上是关于针对另一个表验证存储为 CSV 的列数据的主要内容,如果未能解决你的问题,请参考以下文章

针对另一个表的随机 MySQL 查询验证

获取存储在另一个表中的列的定义而不连接两次

使用 Spark 验证 CSV 文件列

如何在没有具体的情况下将 CSV 数据存储在某种数据结构中:C++ 中的列数、列类型等

求一个统计月份mysql 存储过程

如何使用第一行的列名将 CSV 导入 BigQuery 上的现有表?