SQL批量查询和替换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL批量查询和替换相关的知识,希望对你有一定的参考价值。
假如: FID 姓名 座号 住址
1 张三 21 北京
2 李四 35 上海
3 王五 13 天津
。 。 。 。
。 。 。 。
。 。 。 。
查询 ID和座号来替换姓名和住址
更改后想得到以下形态
改后: FID 姓名 座号 住址
1 丁一 21 福建
2 路人甲 35 厦门
3 路人乙 13 泉州
。 。 。 。
。 。 。 。
。 。 。 。
当数据很多的时候怎么样可以一次替换
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 text
和old text more text
分别替换为new text
和new 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批量查询和替换的主要内容,如果未能解决你的问题,请参考以下文章