有点模糊的标题,我会解释.
我正在编写一个SQL脚本来为我的数据库中的每一行创建一个insert语句,纯粹是为了能够将该数据应用回另一个数据库.
这就是我现在所拥有的:
SELECT 'INSERT INTO products (id,name,description) VALUES ('||ID||','''||name||''','''||description||''');' FROM products
Run Code Online (Sandbox Code Playgroud)
并且效果很好,输出:
INSERT INTO products (id,name,description) VALUES (1,'Lorem','Ipsum');
INSERT INTO products (id,name,description) VALUES (2,'Lorem','Ipsum');
INSERT INTO products (id,name,description) VALUES (3,'Lorem','Ipsum');
INSERT INTO products (id,name,description) VALUES (4,'Lorem','Ipsum');
Run Code Online (Sandbox Code Playgroud)
问题是如果其中一个字段为空,该行将无法生成更新脚本,则在输出文件中该行只是空白.显然,因为有20多个字段,一些可选,这意味着几乎没有任何脚本生成.
有没有办法解决这个问题?
小智 13
pg_dump -a -U user1 -t products -f products.copy database1
Run Code Online (Sandbox Code Playgroud)
然后:
psql -U user2 -d database2 -f products.copy
Run Code Online (Sandbox Code Playgroud)
你完成了 它也更安全,更快捷.
使用quote_nullable()PostgreSQL 8.4 中的 new 函数。除了允许 NULL 值外,它还保留您的数据类型并保护您免受 Bobby 表(SQL 注入)的影响:
SELECT 'INSERT INTO products (id,name,description) VALUES (' ||
quote_nullable(ID) || ',' || quote_nullable(name) || ',' ||
quote_nullable(description) || ');' FROM products;
Run Code Online (Sandbox Code Playgroud)
在旧版本中,您可以使用coalesce()and获得相同的行为quote_literal():
SELECT 'INSERT INTO products (id,name,description) VALUES (' ||
coalesce(quote_literal(ID), 'null') || ',' ||
coalesce(quote_literal(name), 'null') || ',' ||
coalesce(quote_literal(description), 'null') || ',' ||
');' FROM products;
Run Code Online (Sandbox Code Playgroud)
在NULL字段的情况下,您可以执行类似的操作
Select COALESCE(Name, '') from...
Run Code Online (Sandbox Code Playgroud)
coalesce函数返回列表中的第一个非空值.
对于真正空白的字段(例如空的nvarchar),我相信上面的脚本可以正常工作.
| 归档时间: |
|
| 查看次数: |
20866 次 |
| 最近记录: |