我有一个表,其中列中存储了多个引用另一个表的ID。我让我们说ids 1,5并希望在表中找到具有该值的行。 表结构如下:
ID子类别类别(这是指另一个表格)
1一个1,3,15
2 AB 1,10,4
3 ABC 3,5
4个ABCD 3,4,6,11
5 ABCDE 2,5-
6 ABCDEF 24,3,15
SELECT * from table_name WHERE Category =“%1%”OR Category =“%5%”; 使用通配符不会返回正确的行。 任何想法如何获得正确的行(即1,2,3,5)
答案 0 :(得分:3)
您可以使用FIND_IN_SET
SELECT *
from table_name
WHERE find_in_set(1, Category) > 0
or find_in_set(5, Category) > 0
如果您更改了表格设计,那么选择更快更容易,因为它可以使用索引。
答案 1 :(得分:0)
尝试像这样查询。
SELECT * FROM table_name WHERE Category IN (1) OR Category IN (5);
答案 2 :(得分:0)
我很确定它适用于mysql,但是这个适用于SQL-Server
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
GO
CREATE TABLE #test (
id INT,
subcategory VARCHAR(100),
category VARCHAR(100)
)
INSERT INTO #test values (1, 'a','1,3,15');
INSERT INTO #test values (2, 'ab','1,10,4');
INSERT INTO #test values (3, 'abc','3,5');
INSERT INTO #test values (4, 'abcd','3,4,6,11');
INSERT INTO #test values (5, 'abcde','2,5');
INSERT INTO #test values (6, 'abcdef','24,3,15');
SELECT t.*
FROM #test t
CROSS APPLY( SELECT * FROM [dbo].[fnSplitString](t.category,',') a
WHERE CAST(splitdata AS INTEGER) = 3
) a