Sql server SQL-如何在字段中的分隔符之间进行查询
我继承了一个设计非常糟糕的数据库,我将很快重新设计它。然而,在此期间,我需要能够创建一个正确搜索此数据的查询。我已经知道如何简单地搜索它,我有一个搜索它的查询,但我想返回更准确的结果 我先解释一下我的工作内容。SQL列包含以下格式的数据: 门猫车|电脑纸车|房门电脑| 其中|是项目之间的分隔符(存储在单个字段中。Hmmm…)。在表的每一行中,字段中可以有0到任意数量的项,每个项由|分隔。它本质上是数据库字段中的数据库 我现有的查询搜索得很好,但是假设我在同一个查询中同时搜索了Cat和Computer,那么当这两个词都出现在值中时,它将返回上面的行。我希望实现的是,如果两个单词都出现在该值中任何分隔项之间,那么它只返回上面的行。在上面的示例数据中,搜索Cat和Computer不会返回此行,因为它们不会同时出现在分隔符之间Sql server SQL-如何在字段中的分隔符之间进行查询,sql-server,database,Sql Server,Database,我继承了一个设计非常糟糕的数据库,我将很快重新设计它。然而,在此期间,我需要能够创建一个正确搜索此数据的查询。我已经知道如何简单地搜索它,我有一个搜索它的查询,但我想返回更准确的结果 我先解释一下我的工作内容。SQL列包含以下格式的数据: 门猫车|电脑纸车|房门电脑| 其中|是项目之间的分隔符(存储在单个字段中。Hmmm…)。在表的每一行中,字段中可以有0到任意数量的项,每个项由|分隔。它本质上是数据库字段中的数据库 我现有的查询搜索得很好,但是假设我在同一个查询中同时搜索了Cat和Comput
我知道这有多混乱,但这是我唯一的选择,直到我能彻底检修这个数据库。有人知道我如何创建某种选择查询或命令来帮助我解决这个问题,而不必执行常规查询、按分隔符拆分、将其转储到数组中,然后在代码中对其进行进一步过滤吗?这就是您要找的
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)