首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用REPLACE替换唯一VARCHAR上的字符

使用REPLACE替换唯一VARCHAR上的字符
EN

Stack Overflow用户
提问于 2013-11-11 22:21:58
回答 4查看 1.1K关注 0票数 0

我遇到了需要删除字符‘’的情况来自特定表中具有唯一性约束的VARCHAR。我更喜欢在SQL中完成这项工作,而不是自定义应用程序代码。我有进行更改的逻辑,但我正在努力克服VARCHAR上的唯一性约束。

下面是我的测试表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE [dbo].[TableName] (
    [TableNameID]   INT           IDENTITY (1, 1) NOT NULL,
    [TableInfo]     VARCHAR (128) NOT NULL,
    CONSTRAINT [unq_TableName] UNIQUE NONCLUSTERED ([TableInfo] ASC)
)

下面是执行替换的逻辑(不处理唯一性约束):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UPDATE TableName
SET TableInfo = REPLACE(TableInfo, '.', '_')
WHERE TableInfo LIKE '%.%'

我正在尝试克服我用以下数据集创建的测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TableNameID | TableInfo
-------------------------
     1      |  Test
     2      |  Test.
     3      |  Test_
     4      |  Test__

在这方面的任何帮助都将非常感谢。

EN

回答 4

Stack Overflow用户

发布于 2013-11-11 22:26:06

它应该是唯一的吗?如果答案是“是”,那么你必须设法找出如何消除重复数据。在您的示例中,您如何处理ID 3?您将使用TableInfo = 'Test_‘创建两条记录。你必须开发出某种方法来组合或消除其中的一个。

如果答案是“否”,那么简单地删除约束。

票数 1
EN

Stack Overflow用户

发布于 2013-11-11 22:37:06

您可以这样做:

  1. 创建一个count查询,并在where中使用count仅选择小于2的值
  2. 此结果是没有重复项的记录
  3. 将此查询用作更新的源
  4. 运行您的更新查询,这将仅对没有重复的数据起作用,并且更新将正确运行。

您可以创建另一个具有多个计数的查询,以查找重复项并根据需要使用它们。

这是一个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UPDATE  TableToUpdate
SET     columnToUpdate = REPLACE(columnToUpdate, '.', '')
FROM    ( SELECT    COUNT(*) AS Count ,
                    ID
          FROM      TableToUpdate
          GROUP BY  columnToUpdate
          HAVING    ( COUNT(*) < 2 )
        ) AS QueryData
WHERE   tableToUpdate.ID = QueryData.ID
票数 0
EN

Stack Overflow用户

发布于 2013-11-12 00:53:47

如果您知道要更新的行的PK,则此代码有效:-

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare @unique varchar(50)
set @unique = ''

while 1=1 begin
    set @unique+='_'
    update t set 
        t.TableInfo = replace(t.TableInfo, '.', @unique)
    from dbo.tablename t
    where t.TableNameID=2 --t.tableinfo like '%.%'
    and not exists(
        select *
        from dbo.TableName csq
        where csq.TableInfo = replace(t.TableInfo, '.', @unique)
    )
    if @@rowcount=1
        break
end

代码是脆弱的,例如,如果TableInfo列的宽度不足以通过附加多个下划线来创建唯一键,则该代码将失败。

枚举需要更新的记录集上的游标-然后为每个PK调用此代码应该很简单(或者将其转换为UDF并使用cross apply调用它)。

我将不得不更努力地思考如何让它基于set工作。当我睡了一觉后,我可能会带着不同的答案回来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19917133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文