嗨我有2列的表。 Name varchar(50)
和RoleType Varchar(500)
。
现在我将roletype
2和4作为参数传递,并希望获得roletype
列中Roletype
为2或4的所有数据。例如,2和4 roletype
的结果是测试a,测试d,测试c和测试e。
我尝试使用以下查询,但它无效。
SELECT * FROM Userinfo where Roletype in ('2', '4')
答案 0 :(得分:4)
使用拆分功能拆分逗号分隔的列值:
分割功能:
CREATE FUNCTION [dbo].[fnSplit]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
现在更新您的查询,如下所示:
SELECT *
FROM Userinfo
WHERE EXISTS (SELECT Data
FROM [dbo].[fnSplit] (Roletype,',')
WHERE Data IN (2, 4) )
示例:
SELECT *
FROM Category
SELECT *
FROM Category C
WHERE EXISTS (SELECT *
FROM [dbo].[fnSplit] (Name, ',')
WHERE DATA IN ('test', 'test3'))
初始:
输出:
答案 1 :(得分:0)
尝试使用以下查询获取所需的输出 -
SELECT
*
FROM
Userinfo
WHERE
Roletype = '2'
OR Roletype = '4';
答案 2 :(得分:0)
SELECT
*
FROM
[Userinfo] AS [ui]
CROSS APPLY
(
SELECT
[str] = [X].[C].[value]('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT
[X] = CONVERT(XML, '<i>' + REPLACE([ui].[roletype], ',', '</i><i>') + '</i>').query('.')
) AS [A]
CROSS APPLY
[X].[nodes]('i') AS [X]([C])
) AS [s]
WHERE
[s].[str] IN ('2', '4');
答案 3 :(得分:0)
Sandip Patel的拆分解决方案很好。 不过,如果需要,你可以使用LIKE。
您可以编写类似
的内容SELECT
*
FROM
Userinfo
WHERE
Roletype LIKE '%,2,%'
OR Roletype LIKE '2,%'
OR Roletype LIKE '%,2' etc.