在sql中拆分输入字符串并从另一个表中获取其值

时间:2018-03-26 16:55:37

标签: sql sql-server

我有一个桌子爱好和另一个桌子爱好值。

 Hobby Table
 ===========
 hobbies (It is a list of hobbies which user has inserted using checkbox. It gets stores hobby as Ids with a delimiter ^ for e.g hobbyId1^hobbyId2^hobbyId3^)


Hobby Value Table (it has two columns id, Value)
============
hobbyId1 | Football
hobbyId2 | baseball
hobbyId3 | chess

我被限制使用这种表格格式,因为它是大型应用程序的一部分。我不知道如何编写一个sql函数,其中输入字符串是来自Hobby表的爱好,out put将是它的值。

 for e.g.
 ============================
 string inputHobbies = hobbies from Hobby table , hobbyId1^hobbyId2^hobbyId3^
 outputValues = input my_sql_function(inputHobbies)

 outputValues should be football,baseball,chess

我甚至不知道应该如何开始这样做。

2 个答案:

答案 0 :(得分:0)

CREATE FUNCTION [dbo].[SplitForDelimiter] -- a table-valued function
(    
      @delimiter VARCHAR(10),
      @input VARCHAR(1000)

)
RETURNS @tempTable TABLE(
data VARCHAR(100)
)
BEGIN

DECLARE @tempstr VARCHAR(1000)
SET @tempstr = @input
WHILE(charindex(@delimiter,@tempstr,0) > 0)
BEGIN
      DECLARE @t VARCHAR(100)
      SET @t = Substring(@tempstr,0,(charindex(@delimiter,@tempstr,0)))
      INSERT into @tempTable (data) VALUES (@t)
      SET @tempstr = Substring(@tempstr,charindex(@delimiter,@tempstr,0)+1,Len(@tempstr))
      if(charindex(@delimiter,@tempstr,0) <=0)
      BEGIN
      INSERT into @tempTable (data) VALUES (@tempstr)
      END
END

然后

SELECT Value from HobbyValue HV 
WHERE ID IN (select * from SplitForDelimiter('^','hobbyId1^hobbyId2^hobbyId3^'))

答案 1 :(得分:0)

首先,您需要一些字符串拆分功能。如果您使用的是Sql Server 2016+,则应该内置json.JSONDecoder函数(https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql)。

如果没有,你可以使用下面的一个,这是我之前从另一个SO问题中得到的。

STRING_SPLIT

然后您可以拆分您的爱好ID并将它们加入CREATE FUNCTION fnc_splitstring ( @stringToSplit VARCHAR(MAX) ) RETURNS @returnList TABLE ([Name] [nvarchar] (500)) AS BEGIN DECLARE @name NVARCHAR(255) DECLARE @pos INT WHILE CHARINDEX('^', @stringToSplit) > 0 BEGIN SELECT @pos = CHARINDEX('^', @stringToSplit) SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1) INSERT INTO @returnList SELECT @name SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos) END INSERT INTO @returnList SELECT @stringToSplit RETURN END 表,将实际名称和Hobby结果再次合并到一个结果行中:

STUFF

最终用法如下:

CREATE FUNCTION fnc_getHobbies (@listOfHobbyIds NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN 
    DECLARE @hobbies NVARCHAR(MAX)
    SELECT @hobbies = STUFF((   SELECT ',' + hobby
            FROM dbo.fnc_splitstring(@listOfHobbyIds) hb
            INNER JOIN hobby h on h.id = hb.name
            FOR XML PATH('')
            ), 1, 1, '')
    RETURN @hobbies
END

最后,这是SQL小提琴:http://sqlfiddle.com/#!18/44cd9