我有名为MemberID的列,其中包含memberid列表 (1 | 2 | 3 | 12 | 23 | 12)所有Id由|分隔我想我可以传递一个ID,所以获取包含提供的ID的所有行。
答案 0 :(得分:1)
请试试这个
从SQL 2016开始支持
CREATE TABLE #Test
(
RowID INT IDENTITY(1,1),
EID INT,
Sampl VARCHAR(50)
)
INSERT INTO #Test VALUES (1,'1|2|3|4')
INSERT INTO #Test VALUES (2,'1|2|3|5')
INSERT INTO #Test VALUES (3,'1|2|3|4')
INSERT INTO #Test VALUES (4,'1|2|3|6')
GO
SELECT * FROM #Test
CROSS APPLY STRING_SPLIT ( Sampl , '|' )
WHERE Value IN ('4')
RowID EID Sampl value
----------- ----------- -------------------------------------------------- --------------------------------------------------
1 1 1|2|3|4 4
3 3 1|2|3|4 4
对于较低版本的SQL,您可能需要创建一个函数来执行该过程
CREATE FUNCTION dbo.SplitString(@String NVARCHAR(MAX), @Delimiter CHAR(1))
RETURNS @Results TABLE (Result NVARCHAR(MAX))
AS
BEGIN
DECLARE @Index INT
DECLARE @Data NVARCHAR(MAX)
SELECT @Index = 1
IF @String IS NULL RETURN
WHILE @Index != 0
BEGIN
SELECT @Index = CHARINDEX(@Delimiter, @String)
IF @Index != 0
SELECT @Data = LEFT(@String, @Index - 1)
ELSE
SELECT @Data = @String
INSERT INTO @Results(Result) VALUES (@Data)
SELECT @String = RIGHT(@String, LEN(@String) - @Index)
IF LEN(@String) = 0 BREAK
END
RETURN
END
SELECT * FROM #Test
CROSS APPLY Gemini.dbo.SplitString ( Sampl , '|' )
WHERE Result IN ('4')
答案 1 :(得分:0)
尚未对其进行测试,但这应该有效:
declare @Id varchar(10)='1'
select * from content_membeparticipation where charindex('|' + @Id + '|','|' + memberId + '|' )>0
但我同意这些意见,如果可能的话,最好的选择是规范化表格