类似于this , 是否可以在 PostgreSQL 中将字符串字段转换为数字字段。例如,
create table test (name text);
insert into test (name) values ('amy');
insert into test (name) values ('bob');
insert into test (name) values ('bob');
insert into test (name) values ('celia');
并添加一个字段是
name | num
-------+-----
amy | 1
bob | 2
bob | 2
celia | 3
最佳答案
最有效的“散列”函数是 serial
主键 - 为您提供一个您希望在问题中使用的唯一编号。
我还在这个演示中处理重复项:
CREATE TEMP TABLE string (
string_id serial PRIMARY KEY
,string text NOT NULL UNIQUE -- no dupes
,ct int NOT NULL DEFAULT 1 -- count instead of dupe rows
);
然后你会像这样输入新的字符串:
(Data-modifying CTE 需要 PostgreSQL 9.1 或更高版本。)
WITH x AS (SELECT 'abc'::text AS nu)
, y AS (
UPDATE string s
SET ct = ct + 1
FROM x
WHERE s.string = x.nu
RETURNING TRUE
)
INSERT INTO string (string)
SELECT nu
FROM x
WHERE NOT EXISTS (SELECT 1 FROM y);
如果字符串 nu
已经存在,则计数 (ct
) 加 1。如果不存在,则插入一个新行,从 1 开始计数。
UNIQUE
还会自动在 string.string
列上添加索引,从而为该查询带来最佳性能。
为 UPDATE
/DELETE
添加额外的逻辑(触发器?)以使其防弹 - 如果需要的话。
请注意,如果两个并发事务试图在同一时刻及时添加相同的字符串,则这里存在一个极小的竞争条件。可以肯定的是,您可以使用 SERIALIZABLE
事务。此 this related question 下的更多信息和链接.
Live demo at sqlfiddle .
关于sql - 在 PostgreSQL 中将(字符串)因子转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712309/