日期:2014-05-17  浏览次数:20911 次

新手求助!请见问题!谢谢!
假设有一个表,id, name
                    6225,工行
                    522899,交行信用卡
                    955742,农行
                           ...   , ...
id表示银行卡号的前面几位数字(不定长的),id最少4位,最长是银行卡号的18位数,现在给你一张银行卡,不知道是哪个银行的,如何写一个SQL语句(oracle)输出这个银行的名字。
谢谢各位了!
oracle

------解决方案--------------------
引用:
引用:SELECT NAME FROM 你的表 WHERE 你的表.ID LIKE SUBSTR('给的18位银行卡号',1,4)
------解决方案--------------------
'%'可能是我刚刚表的内容没有写清楚,这个不能只看4位,后面的会存在重复的情况,比如:6228 596   工行   , 6228 593   招行,  虽然这个现实中不太可能,出题目的人也是假设这种情况的存……


反正我觉着从常识来说,这个题目有点问题,那就这样理解了,ID最短是4位,最长是18位,那就优先匹配长度最长的那个ID,如果能够匹配上的话,则返回,如果匹配不上,则去找更短的那个ID,如下:

WITH T AS(
SELECT 6225 AS ID,'工商银行' AS NAME FROM DUAL UNION ALL
SELECT 62251 AS ID,'农业银行' AS NAME FROM DUAL UNION ALL
SELECT 622512 AS ID,'建设银行' AS NAME FROM DUAL UNION ALL
SELECT 6225123 AS ID,'民生银行' AS NAME FROM DUAL UNION ALL
SELECT 62251234 AS ID,'邮政银行' AS NAME FROM DUAL UNION ALL
SELECT 622512345 AS ID,'瑞士银行' AS NAME FROM DUAL
)
SELECT ID,NAME FROM T WHERE T.ID IN(
    SELECT MAX(ID) FROM T WHERE '62251234567890' LIKE ID
------解决方案--------------------
'%'
);

结果

ID NAME
622512345 瑞士银行