如何用sql语句解决如下问题:课程表Course和科目表Subject,要将两个表连接,Subject表的 “拆分”列 可以用'、’分成多个字符串,只要其中一个是在Course 表的neme列的子串,就应该连接。比如:Course.name    Subject.拆分
管理学          管理、金融只要“管理”或“金融”至少一个是“管理学”的子串,那么就经“管理学” 和“管理、金融”对应,实现这样的sql语句怎么写呢?

解决方案 »

  1.   

    不知道是不是你想要的?
    select a.[科目],b.[name] from [Subject] a,[Course] b
    where charindex(b.[name]+N'、',a.[拆分]+N'、')>0
      

  2.   

    charindex 里面那个“+N”没看懂,给解释下呗,谢谢
      

  3.   

    他加+N'、' 是为了,避免 '管理学'、'管理学及xx学' 这样的字符串,没法区分。如果为了这样,那就应该
    (N'、'+b.[name]+N'、',N'、'+a.[拆分]+N'、') 更严谨。因为还会有'工商管理学',前后都得顾到。
      

  4.   

    但说句实话,即使这样的情况在你的“管理学 管理、金融” 这种数据面前,也连不出来。因为 你这种数据,在上面的语句中查询,是 从“管理、金融” 字符串里 找 “管理学” 明显没有嘛因为多了个“学” 所以 你还是搜搜 “SQL Split”现成的自定义函数吧,应该有人写过,拿来用用。
      

  5.   

    多谢您的帮助。好像是我没说明白,我的意思是在Subject的“拆分”那一列,比如“管理、金融”,把它用‘、’分成多个字符串“管理”和“金融”,只要这些拆成的字符串有至少一个是Course.name(比如 ‘管理学’) 的子串就应该匹配。用伪代码表示:
    select a.name b.name 
    from Course a ,Subject b
    where Any of(split(b.拆分,‘、’)is subString of a.name
      

  6.   

    --传递字符串 分割字符串 分别显示
    ALTER function [dbo].[f_splitstr]
    (
    @SourceSql varchar(8000),
    @strSeprate varchar(100)
    )
    returns @temp table (F1 varchar(100))
    as
    begin
    declare @ch as varchar(100)
    set @SourceSql=@SourceSql+@StrSeprate
    while(@SourceSql<>'')
    begin
    set
    @ch=left(@SourceSql,Charindex(',',@SourceSql,1)-1)
    insert @temp values(@ch)
    set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
    end
    return
    end
    给你个例子可以看看