Sybase连接表,其中一列已修改

时间:2018-02-23 06:40:22

标签: sql sybase sybase-asa

Table1:
Col1 | Col2 | Col3
 a1  | b1   | c1
 a2  | b1   | c2
 a3  | b2   | c3

Table2:
Col1 | Col2 | Col3
 a1  | y1   | z1
 a2  | y3   | z2
 a3  | y3   | z3 

事实是b1实际上对应于y1,但是它们不能被比较,因为它们不相同。 b2,b3也是如此。您可以参考以下代码来理解我的意思。

现在我想使用Col1和Col2在两个表上应用Inner Join。

我尝试了这段代码,但它不起作用。

SELECT Col1,
        (CASE Col2
        WHEN 'ENXTPAR_ID' THEN 'XPAR'
        WHEN 'ENXTAMS_ID' THEN 'XAMS'
        WHEN 'ENXTLIS_ID' THEN 'ENXL'
        ELSE Col2
        END) as Col2,
        Col3
FROM Table1
INNER JOIN Table2
ON Table1.Col1= convert(varchar,Table2.Col1)
AND Table1.Col2 = Table2.Col2

我希望问题很清楚。

1 个答案:

答案 0 :(得分:1)

我认为CASE表达式需要处于ON条件,而不是选择:

SELECT t1.*
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.Col1 = CONVERT(varchar, t2.Col1) AND
       t2.Col2 = CASE t1.Col2
                 WHEN 'ENXTPAR_ID' THEN 'XPAR'
                 WHEN 'ENXTAMS_ID' THEN 'XAMS'
                 WHEN 'ENXTLIS_ID' THEN 'ENXL'
                 ELSE t1.Col2 END;

上述逻辑假定您要将Table2.Col2列与Table1.Col2列的修改进行比较。例如,如果Table1ENXTPAR_ID,那么匹配将与Table2和值XPAR匹配。如果我向后排列,那么您可以轻松切换CASE表达式。

当然,这里最好的长期解决方案是设置可以映射相等的连接列,甚至可以在适当的位置添加索引。但是,有时我们会被其他人的数据集困住,我们必须应对这一点。