0

我有一个Train用这个示例数据调用的表:

train_id strt_stn_id  end_stn_id    direction
---------------------------------------------
1         1             10            D         
2         1             21            D         
3        10             1             U         
4         1             5             D         
5         1            15             D   

以及Station包含此数据的表格:

stn_id    stn_name
---------------------
1         Churchgate
2         Marine Lines
3         Charni Road
4         Grant Road
5         Mumbai Central
6         Mahalaxmi
7         Lower Parel
8         Elphinstone Road
9         Dadar
10        Matunga Road
11        Mahim
12        Bandra
13        Khar Road
14        Santacruz
15        Vile Parle  

我想要根据条件的站名。如果strt_stn_id > end_stn_id,我要站名,end_stn_id否则站名strt_stn_id

那么如何在 SQL 查询中使用 if 条件呢?

4

3 回答 3

4

尝试这个:

SELECT T.*, S.stn_name
FROM Train T
INNER JOIN Station S
    ON  CASE WHEN T.strt_stn_id > T.end_stn_id 
        THEN T.end_stn_id ELSE T.strt_stn_id END = S.stn_id
于 2013-01-18T14:44:30.707 回答
0

利用case

http://www.tizag.com/sqlTutorial/sqlcase.php

举例说明如何使用

    '站' = 案例
    当 (strt_stn_id > end_stn_id) 那么 (end_stn_id)
    否则(strt_stn_id)
        结尾
于 2013-01-18T14:44:19.063 回答
0

虽然您绝对可以将逻辑放在on子句中,但我更喜欢做两个单独的连接并将逻辑放在select子句中:

SELECT T.*,
       (case when t.strt_stn_id > t.end_stn_id then starts.stn_name
             else ends.stn_name
        end) as TheName
FROM Train T INNER JOIN
     Station Starts
     ON T.strt_stn_id = Starts.stn_id inner join
     Station ends
     on T.end_stn_id = ends.stn_id

通常,子句case中的语句或函数会on阻止引擎使用索引。如果表有合理的索引(例如在它们的主键上),这个版本会更好。顺便说一句,我也认为条款中的逻辑select更容易理解,但我承认其他人可能不同意。

于 2013-01-18T15:40:19.543 回答