【问题标题】:Find rows in SQL table that have specific part of value columns在 SQL 表中查找具有特定部分值列的行
【发布时间】:2015-01-23 13:14:39
【问题描述】:

我有一个表,其中一个列中存储了多个引用另一个表的 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)

【问题讨论】:

  • 您使用什么数据库引擎? SQL-Server 和 MySQL 是不同的东西。
  • 1.请参阅规范化。

标签: php mysql sql-server


【解决方案1】:

您可以使用FIND_IN_SET

SELECT * 
from table_name 
WHERE find_in_set(1, Category) > 0
or find_in_set(5, Category) > 0

但实际上你不应该在一个列中存储多个值。

如果你改变你的表设计,它会更容易选择并且更快,因为它可以利用索引。

【讨论】:

  • 注意:这是特定于 mysql 的。该问题也用 SQL-Server 标记。
  • 感谢您的提示。没有看到 SQL-Sever 标记
【解决方案2】:

尝试这样查询。

SELECT * FROM table_name WHERE Category IN (1) OR Category IN (5);

【讨论】:

  • 如果您只是猜测并且不知道这是否真的有效,请将其发布为评论而不是答案。不清楚你什么时候说要试试
【解决方案3】:

我很确定它适用于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2011-03-21
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多