SQL批量查询和替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL批量查询和替换相关的知识,希望对你有一定的参考价值。

假如: FID 姓名 座号 住址
1 张三 21 北京
2 李四 35 上海
3 王五 13 天津
。 。 。 。
。 。 。 。
。 。 。 。
查询 ID和座号来替换姓名和住址
更改后想得到以下形态
改后: FID 姓名 座号 住址
1 丁一 21 福建
2 路人甲 35 厦门
3 路人乙 13 泉州
。 。 。 。
。 。 。 。
。 。 。 。
当数据很多的时候怎么样可以一次替换

参考技术A 1.把新的结果集在xls文件中做好,保存文件.
2.在数据库中新建一个存储新数据并用于替换的表.
用create table,或者select into ...where 1<>1克隆.
3.将xls文件数据批量导入数据库新表.
4.用联表更新语句,将新表数据更新到表中.
5.drop table 语句删除临时用的存储表.
---------
此语句用于mssql批量导入,注意在导入时文件需处于关闭.
例:insert into TableName(Column1,Column2,Column3,Column4)
select Column1,Column2,Column3,Column4 from OpenDataSource
(
'Microsoft.Jet.OLEDB.4.0',
'Data Source="Path\FileName.xls";User ID=Admin;Password=;Extended properties=Excel 5.0'
)...sheet1$本回答被提问者采纳

使用字符串替换的 Django 批量更新

【中文标题】使用字符串替换的 Django 批量更新【英文标题】:Django bulk update with string replace 【发布时间】:2014-02-23 06:04:50 【问题描述】:

我正在尝试更新和修改 Django 的 ORM 字符串字段。执行此操作的等效 SQL 是:

UPDATE example_table SET string_field = REPLACE(string_field, 'old text', 'new text');

通过该查询,对于string_field 列中的所有条目,我希望old textold text more text 分别替换为new textnew text more text

Bulk update() 看起来很有希望,但不允许我只修改部分字段,F() expressions 只实现数字更改,而不是字符串替换。我还研究了使用raw queries 来运行上面的 SQL,但这似乎是一个横向的 hack(特别是因为 F() 存在对数字执行相同的功能),我无法让它们实际执行。

我最终得到了这个,但是当我知道有一条 SQL 语句可以执行时,执行所有额外的查询似乎很可惜。

for entry in ExampleModel.objects.all():
    entry.string_field = entry.string_field.replace('old text', 'new text', 1)
    entry.save()

在 Django 的字符串 ORM 中还没有这个功能吗?我在文档中忽略了什么?

相关的 SO 问题:

generate update query using django orm SQL statement to remove part of a string

【问题讨论】:

我把这个问题带回来了。我能找到的最好方法是在 Python 代码中进行字符串处理。如果您不介意使用原始 SQL,则替换功能在任何数据库之间都非常一致。 【参考方案1】:

使用 django 1.9 测试

from django.db.models import F, Func, Value

ExampleModel.objects.filter(<condition>).update(
    string_field=Func(
        F('string_field'),
        Value('old text'), Value('new text'),
        function='replace',
    )
)

更新 Django 2.1 https://docs.djangoproject.com/en/2.2/ref/models/database-functions/#replace

from django.db.models import Value
from django.db.models.functions import Replace

ExampleModel.objects.filter(<condition>).update(
    string_field=Replace('string_field', Value('old text'), Value('new text'))
)

【讨论】:

适用于 1.8+ docs.djangoproject.com/en/1.8/ref/models/expressions/… 和 PostgreSQL 使用 mysql (mariadb) 在 1.11 上工作【参考方案2】:

您可以创建自己的F-like 对象来表示 SQL 中的字符串替换。这是一个概念证明:

from django.db.models.expressions import ExpressionNode

class StringReplaceF(ExpressionNode):
    def __init__(self, field, replace_from, replace_to):
        self.field = field
        self.replace_from = replace_from
        self.replace_to = replace_to
        super(StringReplaceF, self).__init__()

    def evaluate(self, evaluator, qn, connection):
        return (
            "REPLACE(, %s, %s)".format(self.field),
            (self.replace_from, self.replace_to)
        )

 >>> f = StringReplaceF('string_field', 'old text', 'new text')
 >>> ExampleModel.objects.update(string_field=f)

如果您需要该类与其他 F 对象表现良好,则需要对该类做更多的工作,但话说回来,现有的 F 对象似乎无论如何都不适用于字符串。

【讨论】:

知道 Django 版本和 DBMS 对此的支持是什么吗? 不确定。我刚刚在 1.6.6 上尝试过;我希望它可以在(很多)早期版本中使用,但不确定具体细节。在 SQL 方面,REPLACE 函数似乎至少在 Postgres、MySQL 和 SQLite 中以这种形式存在。【参考方案3】:

Django 2.1 中的新功能 - Replace database function

您的示例现在可以通过以下方式最轻松地表达:

ExampleModel.objects.update(
    string_field=Replace('string_field', Value('old_text'), Value('new_text'))
)

【讨论】:

你在Replace之后有额外的)【参考方案4】:

Django 2.2支持批量更新,你能用那个功能吗?

检查这个:https://docs.djangoproject.com/en/2.2/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

【讨论】:

以上是关于SQL批量查询和替换的主要内容,如果未能解决你的问题,请参考以下文章

SQL将查询结果中的值批量替换为其它值

sql中如何批量替换字段里的字符串?

如何用Python来进行查询和替换一个文本字符串

多线程海量删除查询和批量插入批量的 SQL 死锁

eclipse 批量 查询 替换

linux下批量查询文件内容字符串并替换