SQL Server 如何联接包含要使用子字符串搜索的字符串的列?

egdjgwm8  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(135)

我试图将一个表连接到另一个表上。这里的技巧是表中的列包含一个长字符串。类似于:

PageNumber-190-ChapterTitle-HelloThere
   PageNumber-19-ChapterTitle-NotToday

我有另一个表,其中包含页码列表以及是否要保留这些页,例如:
| 页码|保留标志|
| - -|- -|
| 一百九十|Y型|
| 十九|不|
我希望能够返回一个包含长字符串的查询,但前提是页码存在于字符串中的某个位置。问题是,当使用LIKE语句进行连接时:

JOIN t2 ON t1.string LIKE '%' + t2.page_number + '%' WHERE keep_flag = 'Y'

无论出于何种原因,它仍然会返回两个结果。结果查询中第19页的“保留标志”列将更改为“Y”,即使它不应出现在结果中。
我显然不认为LIKE是最好的加入方式,因为“19”就像“190”。我还能做什么呢?

edqdpe6u

edqdpe6u1#

请尝试以下解决方案。
它正在对完全匹配项执行JOIN操作。

查询语句

-- DDL and sample data population, start
DECLARE @tbl1 TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(100));
INSERT @tbl1 (tokens) VALUES
('PageNumber-190-ChapterTitle-HelloThere'),
('PageNumber-19-ChapterTitle-NotToday');

DECLARE @tbl2 TABLE (ID INT IDENTITY PRIMARY KEY, Page_Number INT, Keep_Flag CHAR(1));
INSERT @tbl2 (Page_Number, Keep_Flag) VALUES
(190, 'Y'),
(19 , 'N');
-- DDL and sample data population, end

SELECT * 
FROM @tbl1 AS t1 INNER JOIN @tbl2 AS t2
        ON PARSENAME(REPLACE(t1.tokens,'-','.'),3) = t2.Page_Number
WHERE t2.keep_flag = 'Y';

输出

| 识别码|标记|识别码|页码(_N)|保留标志(_L)|
| - -|- -|- -|- -|- -|
| 一个|页码-190-章节标题-您好此处|一个|一百九十|Y型|

6ojccjat

6ojccjat2#

如果Page_number是一个数字,则必须将其归类为varchar,以便类型匹配。
你可以在f1 x的主页上读到,关于转换和转换的信息,请参阅https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver16
第一个
| 串|
| - -|
| 页码-190-章节标题-您好此处|
fiddle

相关问题