我的查询是
DECLARE @Values TABLE
(
value NVARCHAR(255)
)
INSERT INTO @Values VALUES('BWE');
INSERT INTO @Values VALUES('BWT');
INSERT INTO @Values VALUES('IMO I');
INSERT INTO @Values VALUES('IMO II');
INSERT INTO @Values VALUES('BWE-E');
INSERT INTO @Values VALUES('BWE-EP');
INSERT INTO @Values VALUES('IMO III');
INSERT INTO @Values VALUES('BWM-EP(s)');
INSERT INTO @Values VALUES('BWM-EP');
select * from @Values
SELECT a.value
FROM @Values a
INNER JOIN (SELECT 'BWM-EP(s)' AS CLASS_NOTATION) b
ON LTRIM(RTRIM(b.CLASS_NOTATION)) like '%[^a-z0-9]' + LTRIM(RTRIM(a.VALUE)) + '[^a-z0-9]%'
or LTRIM(RTRIM(b.CLASS_NOTATION)) like LTRIM(RTRIM(a.VALUE)) + '[^a-z0-9]%'
or LTRIM(RTRIM(b.CLASS_NOTATION)) like '%[^a-z0-9]' + LTRIM(RTRIM(a.VALUE))
or LTRIM(RTRIM(b.CLASS_NOTATION)) = LTRIM(RTRIM(a.VALUE))
它适用于大多数类符号的情况。但是在这种特殊情况下,当我将'BWM-EP(s)'作为附加符号表示时,它会同时为您提供BWM-EP(s)和BWM-EP。但结果应该是 只有BWM-EP(s)。有什么问题?
正如我从答案中看到的那样,即使这个问题的根本原因是第二个OR条件。当类符号是BWE BWT时,我不能排除那个条件。我怎么能克服这个?
答案 0 :(得分:2)
这是
or LTRIM(RTRIM(b.CLASS_NOTATION)) like LTRIM(RTRIM(a.VALUE)) + '[^a-z0-9]%'
符合BWM-EP
值的条件。
这是有道理的; <{1}}记录可以将此表达式缩减为'BMW-EP(s)' like 'BMW-EP'[^a-z0-9]%
,这显然是正确的。
如果没有它,它的工作原理如下:http://www.sqlfiddle.com/#!3/e5251/6
答案 1 :(得分:1)
试试这个 -
DECLARE @Values TABLE (value NVARCHAR(255))
INSERT INTO @Values
VALUES
('BWE'),('BWT'),('IMO I'),('IMO II'),
('BWE-E'),('BWE-EP'),('IMO III'),
('BWM-EP(s)'),('BWM-EP')
SELECT value
FROM (
SELECT value = LTRIM(RTRIM(value))
FROM @Values
) a
CROSS JOIN (
SELECT note = LTRIM(RTRIM('BWM-EP(s)'))
) t
where note LIKE '%[^a-z0-9]' + value + '[^a-z0-9]%'
OR note LIKE '%[^a-z0-9]' + value
OR note = value
输出 -
value
----------
BWM-EP(s)