2

我的查询是

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 时我需要该条件。我该如何克服呢?

4

2 回答 2

2

这是

or LTRIM(RTRIM(b.CLASS_NOTATION)) like LTRIM(RTRIM(a.VALUE)) + '[^a-z0-9]%'

与值匹配的条件BWM-EP

这是有道理的;这个表达式可以简化'BMW-EP(s)' like 'BMW-EP'[^a-z0-9]%BMW-EP记录,这显然是正确的。

以下是没有它的工作原理:http ://www.sqlfiddle.com/#!3/e5251/6

于 2013-08-08T05:21:50.693 回答
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)
于 2013-08-08T05:31:24.470 回答