Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-如何在字段中的分隔符之间进行查询_Sql Server_Database - Fatal编程技术网

Sql server SQL-如何在字段中的分隔符之间进行查询

Sql server SQL-如何在字段中的分隔符之间进行查询,sql-server,database,Sql Server,Database,我继承了一个设计非常糟糕的数据库,我将很快重新设计它。然而,在此期间,我需要能够创建一个正确搜索此数据的查询。我已经知道如何简单地搜索它,我有一个搜索它的查询,但我想返回更准确的结果 我先解释一下我的工作内容。SQL列包含以下格式的数据: 门猫车|电脑纸车|房门电脑| 其中|是项目之间的分隔符(存储在单个字段中。Hmmm…)。在表的每一行中,字段中可以有0到任意数量的项,每个项由|分隔。它本质上是数据库字段中的数据库 我现有的查询搜索得很好,但是假设我在同一个查询中同时搜索了Cat和Comput

我继承了一个设计非常糟糕的数据库,我将很快重新设计它。然而,在此期间,我需要能够创建一个正确搜索此数据的查询。我已经知道如何简单地搜索它,我有一个搜索它的查询,但我想返回更准确的结果

我先解释一下我的工作内容。SQL列包含以下格式的数据:

门猫车|电脑纸车|房门电脑|

其中|是项目之间的分隔符(存储在单个字段中。Hmmm…)。在表的每一行中,字段中可以有0到任意数量的项,每个项由|分隔。它本质上是数据库字段中的数据库

我现有的查询搜索得很好,但是假设我在同一个查询中同时搜索了Cat和Computer,那么当这两个词都出现在值中时,它将返回上面的行。我希望实现的是,如果两个单词都出现在该值中任何分隔项之间,那么它只返回上面的行。在上面的示例数据中,搜索Cat和Computer不会返回此行,因为它们不会同时出现在分隔符之间


我知道这有多混乱,但这是我唯一的选择,直到我能彻底检修这个数据库。有人知道我如何创建某种选择查询或命令来帮助我解决这个问题,而不必执行常规查询、按分隔符拆分、将其转储到数组中,然后在代码中对其进行进一步过滤吗?

这就是您要找的

declare @table table
(col nvarchar(500))

declare @val nvarchar(500)='Door Cat Car|Computer Paper Car|House Door Computer|'

while (charindex('|',@val)>0)
begin
    insert into @table
    select substring(@val,1,charindex('|',@val)-1)

    set @val=substring (@val,charindex('|',@val)+1,len(@val))

end

select * from @table 
where col like '%car%'

**Result**
Computer Paper Car
Door Cat Car
EDI

DECLARE @SampleTable TABLE
    (
      id INT ,
      entries VARCHAR(100)
    );

INSERT  INTO @SampleTable
        ( id, entries )
VALUES  ( 1, 'Door Cat Car|Computer Paper Car|House Door Computer|' ),
        ( 2,
          'Hat Printer Door|Computer|Boat Paper Phone Pen Computer|Monitor Book|' ),
        ( 3, 'Robot|Cat Computer Hat|' ),
        ( 4, 'Light Board|Monkey|' );




DECLARE @table TABLE ( id INT, col NVARCHAR(500) )

DECLARE @sampleTable2 TABLE
    (
      id INT ,
      entries VARCHAR(1000)
    ) 
DECLARE @val NVARCHAR(500)

INSERT  INTO @sampleTable2
        SELECT  *
        FROM    @SampleTable
        WHERE   entries LIKE '%cat%'
                AND entries LIKE '%Computer%'

DECLARE @id_min INT
DECLARE @id_max INT

SELECT  @id_min = MIN(id) ,
        @id_max = MAX(id)
FROM    @sampleTable2

WHILE ( @id_min <= @id_max ) 
    BEGIN
        SELECT  @val = entries
        FROM    @sampleTable2
        WHERE   id = @id_min
        WHILE ( CHARINDEX('|', @val) > 0 ) 
            BEGIN
                INSERT  INTO @table
                        SELECT  @id_min ,
                                SUBSTRING(@val, 1, CHARINDEX('|', @val) - 1)

                SET @val = SUBSTRING(@val, CHARINDEX('|', @val) + 1, LEN(@val))

            END
        SET @id_min = @id_min + 1
    END

SELECT  *
FROM    @table
WHERE   col LIKE '%cat%'
        AND col LIKE '%Computer%'
DECLARE@SampleTable表
(
id INT,
条目VARCHAR(100)
);
插入@SampleTable
(id,条目)
值(1,‘门猫车|电脑纸车|房门电脑|’),
( 2,
“帽子打印机门|电脑|船纸电话笔电脑|监控簿|”),
(3)"机器人|猫电脑帽| | | | | | | | | | | 124,
(四)"灯板|猴|";;
声明@table table(id INT,col NVARCHAR(500))
声明@sampleTable2表
(
id INT,
条目VARCHAR(1000)
) 
声明@val NVARCHAR(500)
插入@sampleTable2
挑选*
来自@SampleTable
其中包含“%cat%”之类的条目
和“%Computer%”之类的条目
声明@id\u min INT
声明@id\u max INT
选择@id_min=min(id),
@id_max=max(id)
来自@sampleTable2
而(@id_min 0)
开始
插入@table
选择@id\u min,
子字符串(@val,1,CHARINDEX('|',@val)-1)
设置@val=SUBSTRING(@val,CHARINDEX('|',@val)+1,LEN(@val))
结束
设置@id\u min=@id\u min+1
结束
挑选*
来自@table
其中的col类似于“%cat%”
和列,如“%Computer%”
在这里,您将获得id和匹配结果


使用than ID可以获得原始行。

这就是您要查找的内容

declare @table table
(col nvarchar(500))

declare @val nvarchar(500)='Door Cat Car|Computer Paper Car|House Door Computer|'

while (charindex('|',@val)>0)
begin
    insert into @table
    select substring(@val,1,charindex('|',@val)-1)

    set @val=substring (@val,charindex('|',@val)+1,len(@val))

end

select * from @table 
where col like '%car%'

**Result**
Computer Paper Car
Door Cat Car
EDI

DECLARE @SampleTable TABLE
    (
      id INT ,
      entries VARCHAR(100)
    );

INSERT  INTO @SampleTable
        ( id, entries )
VALUES  ( 1, 'Door Cat Car|Computer Paper Car|House Door Computer|' ),
        ( 2,
          'Hat Printer Door|Computer|Boat Paper Phone Pen Computer|Monitor Book|' ),
        ( 3, 'Robot|Cat Computer Hat|' ),
        ( 4, 'Light Board|Monkey|' );




DECLARE @table TABLE ( id INT, col NVARCHAR(500) )

DECLARE @sampleTable2 TABLE
    (
      id INT ,
      entries VARCHAR(1000)
    ) 
DECLARE @val NVARCHAR(500)

INSERT  INTO @sampleTable2
        SELECT  *
        FROM    @SampleTable
        WHERE   entries LIKE '%cat%'
                AND entries LIKE '%Computer%'

DECLARE @id_min INT
DECLARE @id_max INT

SELECT  @id_min = MIN(id) ,
        @id_max = MAX(id)
FROM    @sampleTable2

WHILE ( @id_min <= @id_max ) 
    BEGIN
        SELECT  @val = entries
        FROM    @sampleTable2
        WHERE   id = @id_min
        WHILE ( CHARINDEX('|', @val) > 0 ) 
            BEGIN
                INSERT  INTO @table
                        SELECT  @id_min ,
                                SUBSTRING(@val, 1, CHARINDEX('|', @val) - 1)

                SET @val = SUBSTRING(@val, CHARINDEX('|', @val) + 1, LEN(@val))

            END
        SET @id_min = @id_min + 1
    END

SELECT  *
FROM    @table
WHERE   col LIKE '%cat%'
        AND col LIKE '%Computer%'
DECLARE@SampleTable表
(
id INT,
条目VARCHAR(100)
);
插入@SampleTable
(id,条目)
值(1,‘门猫车|电脑纸车|房门电脑|’),
( 2,
“帽子打印机门|电脑|船纸电话笔电脑|监控簿|”),
(3)"机器人|猫电脑帽| | | | | | | | | | | 124,
(四)"灯板|猴|";;
声明@table table(id INT,col NVARCHAR(500))
声明@sampleTable2表
(
id INT,
条目VARCHAR(1000)
) 
声明@val NVARCHAR(500)
插入@sampleTable2
挑选*
来自@SampleTable
其中包含“%cat%”之类的条目
和“%Computer%”之类的条目
声明@id\u min INT
声明@id\u max INT
选择@id_min=min(id),
@id_max=max(id)
来自@sampleTable2
而(@id_min 0)
开始
插入@table
选择@id\u min,
子字符串(@val,1,CHARINDEX('|',@val)-1)
设置@val=SUBSTRING(@val,CHARINDEX('|',@val)+1,LEN(@val))
结束
设置@id\u min=@id\u min+1
结束
挑选*
来自@table
其中的col类似于“%cat%”
和列,如“%Computer%”
在这里,您将获得id和匹配结果

使用than ID可以获得原始行

  • 组成一个派生表,将要排除的值和要查找的值拆分为两列
  • 然后查询并查找包含列中存在的值,并排除排除列中的值
  • DECLARE@tbl表(
    id INT
    ,VAL NVARCHAR(最大值)
    )
    插入@tbl
    选择1
    ,“门猫车|电脑纸车|房门电脑|”
    插入@tbl
    选择2
    “门狗车”
    插入@tbl
    选择3
    “蒂娜|金枪鱼|托尼|电脑|哈娜”
    挑选*
    从(
    选择id
    案例
    当(charindex(“|”,VAL)>0时
    然后是子字符串(VAL,charindex(“|”,VAL),len(VAL))
    其他VAL
    以VAL结束
    案例
    当(charindex(“|”,VAL)>0时
    然后是子字符串(VAL,0,charindex(“|”,VAL))
    其他VAL
    作为排除项结束
    来自@tbl
    )结核病
    在哪里(
    tb.VAL,如“%tuna%”
    或tb.VAL,如“%computer%”
    )
    及(
    tb.exclude与“%tuna%”不同
    或tb.VAL与“%computer%”不同
    )
  • 组成一个派生表,将要排除的值和要查找的值拆分为两列
  • 然后查询并查找包含列中存在的值,并排除排除列中的值
  • DECLARE@tbl表(
    id INT
    ,VAL NVARCHAR(最大值)
    )
    插入@tbl
    选择1
    ,“门猫车|电脑纸车|房门电脑|”
    插入@tbl
    选择2
    “门狗车”
    插入@tbl
    选择3
    “蒂娜|金枪鱼|托尼|电脑|哈娜”
    挑选*
    从(
    选择id
    案例
    当(charindex(“|”,VAL)>0时
    然后是子字符串(VAL,charindex(“|”,VAL),len(VAL))
    其他VAL
    以VAL结束
    案例
    当(c)