在a,b和c上加入t1,但如果c不为null,则只加入c

时间:2016-07-06 17:37:51

标签: sql sql-server tsql

我想要一些t-sql语法正确的以下版本(希望以下是人类可读的)

CREATE OR REPLACE PACKAGE BODY COP_DBO.PACKAGE_TEMPLATE

 AS
  --
  --*****************************************************************************************************
  -- Purpose: Just a template
  --
  -- Inputs:
  --      in_vSTR    String
  --
  -- Returns:
  --      None
  --
  -- Mod History:
  --      06/29/2016 KEvin Palmer - Created initial version of this procedure
  --
  -- Error Handling:
  --      An error is raised if errors are encountered building or executing the SQL.
  --
  --*****************************************************************************************************
f UTL_FILE.FILE_TYPE;
s VACHAR2(200);
BEGIN
f := UTL_FILE.FOPEN('\\sp0034avrt\winixdb$\cow\dev', 'certs_file.txt', 'R');

UTL_FILE.GET_LINE(f,s);

UTL_FILE.FLCOSE(f);

dbms_outpit.put_line(s);
end;




  sql_statments arr_sql_t := arr_sql_t(); --initialize a empty lis 
  --------------------------------------------------------------------------------
  /*                    PROCEDURE AND VARIABLE 
                        INITILIZATION FOR  COW_DATALOAD_V2
  /***************************************************************************/
  ------------------------------------------------------------------------------
  --*********** PUT YOUR LIST OF CERTS BELOW ******************

  v_certList arr_claims_t := arr_claims_t('3803617642',
                                          '3805126441',
                                          '3876849047',
                                          '3873116383',
                                          '3873306670',
                                          '3878876718');

  --COP VARIABLES---
  new_copId   NUMBER; --NEW COP ID 
  prod_copId  NUMBER; --PROD COP ID
  new_seq_id  NUMBER; --NEW SEQ ID  
  suppl_count NUMBER; --supplemental count

  v_SQL     VARCHAR2(7000);
  v_certLst VARCHAR2(2000);
  n_success NUMBER := 0; --Count of success found
  n_total   NUMBER := 0; --Total Records proccessed
  n_suppl   NUMBER := 0; --Total Records proccessed
  n_orders  NUMBER := 0; --Total lmso orders downloaded

  /*cop procedure*/
  PROCEDURE COP_DATALOAD_V2(arr_claims arr_claims_t,
                            arr_sql    arr_sql_t) AS
  BEGIN

3 个答案:

答案 0 :(得分:4)

NULL

或者,如果T2.c永远不会是SELECT T1.my_column, T2.my_other_column FROM Table1 T1 INNER JOIN Table2 T2 ON T2.a = T1.a AND T2.b = T1.b AND T2.c = COALESCE(T1.c, T2.c)

COALESCE

由于可读性,我喜欢第一种。

编辑: T1.c将第一个非null参数传递给函数。因此,如果上面的NULLT2.c,则会返回T2.c。如果NULL也是NULL = NULL,那么它会尝试评估COALESCE(T2.c, -1) = COALESCE(T1.c, T2.c, -1),这将是 false

你可以通过JOIN来解决这个问题,但是SQL无法很好地使用索引。

如果您希望他们NULL( (T2.c IS NULL AND T1.c IS NULL) OR T2.c = T1.c ) ,那么您可以使用上面的位,或者只拼出每个可能的组合:

{{1}}

答案 1 :(得分:1)

通常可以提供更好性能的技巧

SELECT
    T1.my_column,
    T2.my_other_column
FROM
    Table1 T1
JOIN Table2 T2 
  ON T2.a = T1.a 
 AND T2.b = T1.b 
 AND T2.c = isnull(T1.c, T2.c)

答案 2 :(得分:0)

使用此功能。

select* from table1
join table2 
on table1.a = table2.a
and table1.b = table2.b
and (table1.c is not null or table1.c = table2.c)