我的代码无法按预期运行。
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。
答案 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
)一样多。