我有一个桌子爱好和另一个桌子爱好值。
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
我甚至不知道应该如何开始这样做。
答案 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