如何从条件传递MemberID中选择行?列包含memberID列表

时间:2017-06-09 14:51:29

标签: sql sql-server

我有名为MemberID的列,其中包含memberid列表 (1 | 2 | 3 | 12 | 23 | 12)所有Id由|分隔我想我可以传递一个ID,所以获取包含提供的ID的所有行。

enter image description here

2 个答案:

答案 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

但我同意这些意见,如果可能的话,最好的选择是规范化表格