代码未返回正确的结果

时间:2017-07-19 17:09:58

标签: sql sql-server sql-server-2008

我的代码无法按预期运行。

declare @start int = patindex('_%48%_', asciiValue),
        @end int = (patindex('_%48%_', asciiValue) +1)

select * from imItem 
where asciiValue like ('%48%')
and asciiValue in (SUBSTRING(asciiValue, 1, @start-1) + '79' + SUBSTRING(asciiValue,@end+1,LEN(asciiValue)))

应该在数据库中搜索列AsciiValue包含字符' 48&#的行,并在字段AsciiValue与前面提到的字段相同的行中选择它们,但仅限于不同的是,在同一个地方,' 48'在另一排,这一行有一个' 79'。

例如,
89643931的 48 134122
89643931的 79 134122
将被选中。
请帮忙。

编辑:为了澄清,代码只会在行包含值48时生成行,然后另一行在同一索引中包含79。

2 个答案:

答案 0 :(得分:0)

这可能是您的问题的答案。 UNION的第一部分选择其中包含79的数字,与其他数字匹配,其中48位。第二部分追捕其中48个,其他部分与79个相同。

SELECT asciiValue FROM imItem WHERE
asciiValue IN (
    SELECT concat(substring(asciiValue, 0,patindex('%48%', asciiValue)),'79', substring(asciiValue, patindex('%48%', asciiValue) +2,99)) 
    FROM imItem 
    WHERE asciiValue LIKE ('%48%')
)
UNION
SELECT asciiValue FROM imItem WHERE
asciiValue IN (
    SELECT concat(substring(asciiValue, 0,patindex('%79%', asciiValue)),'48', substring(asciiValue, patindex('%79%', asciiValue) +2,99)) 
    FROM imItem 
    WHERE asciiValue LIKE ('%79%')
)

根据@Jeroen Mostert的评论,有点干净的版本。

SELECT * FROM imItem WHERE
asciiValue IN (
    SELECT STUFF ( asciiValue , CHARINDEX('48', asciiValue) , 2, '79' )
    FROM imItem 
    WHERE asciiValue LIKE ('%48%')
)
UNION
SELECT * FROM imItem WHERE
asciiValue IN (
    SELECT STUFF ( asciiValue , CHARINDEX('79', asciiValue) , 2, '48' )
    FROM imItem 
    WHERE asciiValue LIKE ('%79%')
)

对于像这样的输入

8964393148134122
8964393179134122
8964393179134123
7964393148134122

返回

asciiValue
8964393148134122
8964393179134122

编辑好的,让我们再试一次

SELECT i.* FROM imItem i
JOIN imItem j
    ON (REPLACE(i.asciiValue, '79', '48') = REPLACE(j.asciiValue, '79', '48')
        OR REPLACE(i.asciiValue, '48', '79') = REPLACE(j.asciiValue, '48', '79'))
    AND i.asciivalue <> j.asciivalue
WHERE i.asciiValue LIKE '%48%' OR i.asciiValue LIKE '%79%'

编辑2 这个可能更强大

DECLARE @i int = 1
WHILE @i < 18
BEGIN
    SELECT * FROM imItem AS a
    JOIN imItem AS b
        ON a.asciiValue <> b.asciiValue
    WHERE
        a.asciiValue = STUFF(b.asciiValue, @i, 2, '48')
        AND b.asciiValue = STUFF(a.asciiValue, @i, 2, '79')

    SET @i = @i + 1
END

答案 1 :(得分:0)

SELECT * FROM imItem WHERE asciiValue LIKE '%48%' 
UNION ALL 
SELECT * FROM imItem WHERE asciiValue IN (
    SELECT STUFF(asciiValue, CHARINDEX('48', asciiValue), 2, '79') 
    FROM imItem 
    WHERE asciiValue LIKE '%48%'
)

是您要求的近似字面翻译,除了它不会处理具有多个48实例的行(它只查找与第一个实例替换的对应关系)并且它没有明确地尝试将行放在一对一的关系中以防需要(如果有多个行匹配原来的行并且48被替换,它将返回所有这些,而不是完全与48)一样多。