SQL在根据一列的数据连接不同列时获取数据

SQL在根据一列的数据连接不同列时获取数据,sql,oracle,Sql,Oracle,我想得到类型,Label1,Label2和NUM when Type from TABLE1 = Type Table 2 AND if type from Table1 = x i want Label1 from table1 = Label from Table2 If type from table1 = Y I want LAbl~el2 from table1 = Label from table2 例: 如果表1中的标签1和标签2位于一个命名标签中,我会: SELEC

我想得到类型,Label1,Label2和NUM

when Type from TABLE1 = Type Table 2 
AND if type from Table1 = x i want Label1 from table1 = Label from Table2
    If type from table1 = Y I want LAbl~el2 from table1 = Label from table2

例: 如果表1中的标签1和标签2位于一个命名标签中,我会:

SELECT t1.type, t1.Label, t2.NUM
FROM Table1 t1
     Table2 t2
WHERE t1.type = t2.typ2 and
      t1.LABEL = t2. LABEL
但在我的场景中,表1中有两个标签。标签1表示类型X,标签2表示类型Y

那么,什么是优雅而高效的方法(假设表中有大量数据)来:

这应该是我要进行的选择的结果:

根据条件加入。(我假设空白值为null)


正如Abdul所建议的,根据
label1
label2
,基于
type
的值进行连接;您可以使用
case
语句来执行此操作:

SELECT t1.type, t1.label1, t1.label2, t2.num
FROM table1 t1
JOIN table2 t2
ON t2.type = t1.type
AND t2.label = CASE WHEN t1.type = 'X' THEN t1.label1 ELSE t1.label2 END;

T LABEL1 LABEL2        NUM
- ------ ------ ----------
X DOC                 1000
X INV                 2000
Y        VAL          3000
您也可以在此处使用
decode
,但
case
更通用。这有效地为您提供了一个虚拟的组合列,您可以通过查看添加了case表达式的表1来可视化该列:

SELECT t1.type, t1.label1, t1.label2,
  CASE WHEN t1.type = 'X' THEN t1.label1 ELSE t1.label2 END AS label
FROM table1 t1;

T LABEL1 LABEL2 LABEL
- ------ ------ -----
X DOC           DOC  
X INV           INV  
X MAT           MAT  
Y        VAL    VAL  
Y        VIE    VIE  
Y        TRU    TRU  

如果您确定只填充了一个标签列,并且哪个标签列始终取决于标志,则还可以使用
coalesce
获取要连接的值:

SELECT t1.type, t1.label1, t1.label2, t2.num
FROM table1 t1
JOIN table2 t2
ON t2.type = t1.type
AND t2.label = COALESCE(t1.label1, t1.label2);

使用获得相同结果的示例数据。但是case方法可能更安全,以防两列都被填充。

yes空格值为null。。非常感谢您的快速帮助,这将提供我刚才编辑的结果?添加where子句:“and t2.type is not null”以排除cie&truie和TRU应该已经排除,因为t1.type=t2.type“如果您确定只填充了一列,并且哪一列始终取决于标志(在这种情况下,为什么有两个标签列?)这不是我的决定我正在处理一个这样设计的DB…我不认为我需要select上的大小写,因为即使标签1或2是空的,我想选择所有方式t1.type,t1.label1,t1.LABELE2,t2.num…我将在Where和t2.Label=case上尝试大小写,当t1.type='X'然后t1.label1 EL1 ELS t1.label2结束;@UcanDoIt-对,我把你的第一个查询和你想要的实际输出搞混了,抱歉-修复了。单列只是一个过眼云烟的想法(当然,通用列可能会被滥用,因此无论如何,拥有两列可能是首选),我已经删除了这一点,因为它不相关。
SELECT t1.type, t1.label1, t1.label2,
  CASE WHEN t1.type = 'X' THEN t1.label1 ELSE t1.label2 END AS label
FROM table1 t1;

T LABEL1 LABEL2 LABEL
- ------ ------ -----
X DOC           DOC  
X INV           INV  
X MAT           MAT  
Y        VAL    VAL  
Y        VIE    VIE  
Y        TRU    TRU  
SELECT t1.type, t1.label1, t1.label2, t2.num
FROM table1 t1
JOIN table2 t2
ON t2.type = t1.type
AND t2.label = COALESCE(t1.label1, t1.label2);