在SQL Server中反转字符串

pk1*_*188 2 sql t-sql sql-server sql-server-2008

我有一个产品值如下表:

  1. 苹果iphone

  2. 苹果苹果

  3. 三星手机

  4. 电话三星

我想从表中删除那些完全相反的产品(因为我认为它们是重复的),这样我的表只有2条记录,而不是4条记录.

  1. 苹果iphone

  2. 三星手机

我知道SQL Server中有REVERSE函数,但它会反转整个字符串,而不是我正在寻找的.

我非常感谢任何建议/想法.

Jus*_*ony 5

在我看来,你太复杂了,一个简单的更新声明将起作用:

UPDATE table SET productname = 'apple iphone' WHERE productname = 'iphone apple'
Run Code Online (Sandbox Code Playgroud)

  • @AaronBertrand此外,示例中的语法错误不应成为不支持IMO的原因.在大多数情况下,答案应该更多地是帮助指南.它可以被注释固定,甚至直接修复 (2认同)

Aar*_*and 5

假设你的字典不包含任何XML实体(例如>或者<),并且为UPDATE表中的每个单词组合手动创建一堆语句是不切实际的(如果它是实用的,那么简化你的生活,停止阅读这个回答,并使用Justin的答案),你可以创建一个这样的函数:

CREATE FUNCTION dbo.SplitSafeStrings
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   ( SELECT Item = LTRIM(RTRIM(y.i.value('(./text())[1]', 'nvarchar(4000)')))
     FROM ( SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i));
GO
Run Code Online (Sandbox Code Playgroud)

(如果XML是一个问题,还有其他更复杂的替代方案,例如CLR.)

然后你可以这样做:

DECLARE @x TABLE(id INT IDENTITY(1,1), s VARCHAR(64));

INSERT @x(s) VALUES
  ('apple iphone'),
  ('iphone Apple'),
  ('iphone samsung hoochie blat'),
  ('samsung hoochie blat iphone');

;WITH cte1 AS 
(
  SELECT id, Item FROM @x AS x
  CROSS APPLY dbo.SplitSafeStrings(LOWER(x.s), ' ') AS y
),
cte2(id,words) AS 
(
  SELECT DISTINCT id, STUFF((SELECT ',' + orig.Item 
    FROM cte1 AS orig
    WHERE orig.id = cte1.id
    ORDER BY orig.Item
    FOR XML PATH(''), TYPE).value('.[1]','nvarchar(max)'),1,1,'')
  FROM cte1
),
cte3 AS 
(
  SELECT id, words, rn = ROW_NUMBER() OVER (PARTITION BY words ORDER BY id)
  FROM cte2
)
SELECT id, words, rn FROM cte3
-- WHERE rn = 1 -- rows to keep
-- WHERE rn > 1 -- rows to delete
;
Run Code Online (Sandbox Code Playgroud)

所以你可以在三个CTE之后,而不是SELECT上面的最后一个,说:

DELETE t FROM @x AS t
  INNER JOIN cte3 ON cte3.id = t.id
  WHERE cte3.rn > 1;
Run Code Online (Sandbox Code Playgroud)

应该留下@x什么?

SELECT id, s FROM @x;
Run Code Online (Sandbox Code Playgroud)

结果:

id  s
--  ---------------------------
1   apple iphone
3   iphone samsung hoochie blat
Run Code Online (Sandbox Code Playgroud)