sql - 在 PostgreSQL 中将(字符串)因子转换为数字

标签 sql postgresql types

类似于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/

相关文章:

c# - 如何将类型的默认值设置为 Nothing?

python - Yaml 通过 Camel 序列化 : using base class load/dump and accessing type(self) in decorator

sql - 从 information_schema 中查找 PostgreSQL 中未知表的特定列中的值

mysql - 无法创建互连表

python - 匹配文件名开头和文件扩展名的正则表达式

mysql - 为每个唯一列值选择不禁止用户的最短时间

postgresql - 如何知道 PostgreSQL COPY 是否还活着

types - 如何在erlang中使用-spec功能

sql - 优化plpgsql功能

postgresql - 列出 Postgres 中包含具有 NULL 值的 bool 类型列的所有表?