首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL 'ab,cd‘与'cd,ab’相比是真的

SQL 'ab,cd‘与'cd,ab’相比是真的
EN

Stack Overflow用户
提问于 2014-05-28 07:35:54
回答 1查看 175关注 0票数 0

我在postgresql上有个小问题

我有两个表t1和t2,它们的数据类型都是相同的,col_data可能只有以下数据('ab','cd','ab,cd','cd,ab')

当比较t1.col_data和t2.col_data时,当t1.coldata=‘ab,cd’和t2.col_data = 'cd,ab‘时,我想返回TRUE

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-28 07:40:28

正确的解决方案是修复数据模型,这样就不会将复合数据作为逗号分隔的值存储在文本字段中;请参见this post

短期的解决办法可能是定义一个"commasep_to_sorted_array“函数,类似于:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION commasep_to_sorted_array(text) RETURNS text[] AS $$
SELECT array_agg(t ORDER BY t) FROM regexp_split_to_table($1,',') t;
$$ LANGUAGE sql IMMUTABLE;

然后在比较中使用它:

代码语言:javascript
复制
commasep_to_sorted_array(t1.col_data) = commasep_to_sorted_array(t2.col_data)

不用说,这是没有用的索引。尽管您可以创建一个在某些情况下有用的表达式索引。

如果您的情况真的像您所描述的那样简单,并且只有四个可能的值,那么您可能可以将该列转换为enum:

代码语言:javascript
复制
CREATE TYPE abcd AS ENUM (
   'ab', 'cd', 'ab,cd', 'cd,ab'
);

ALTER TABLE mytable ALTER COLUMN col_data TYPE abcd USING (col_data::abcd);

(虽然我真的希望真名比这个更能说明问题!)

如果您真的将它们作为两个独立的标志来处理,那么值可以是“ab或cd”、"just ab“、"just cd”或“ab和cd",那么您应该用这种方式对它们进行建模--两个布尔字段、一个位域或一个int字段--手动测试位。我更喜欢两个布尔字段,但没有很好的理由不这样做。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23905435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档