我在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
发布于 2014-05-28 07:40:28
正确的解决方案是修复数据模型,这样就不会将复合数据作为逗号分隔的值存储在文本字段中;请参见this post。
短期的解决办法可能是定义一个"commasep_to_sorted_array“函数,类似于:
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;然后在比较中使用它:
commasep_to_sorted_array(t1.col_data) = commasep_to_sorted_array(t2.col_data)不用说,这是没有用的索引。尽管您可以创建一个在某些情况下有用的表达式索引。
如果您的情况真的像您所描述的那样简单,并且只有四个可能的值,那么您可能可以将该列转换为enum:
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字段--手动测试位。我更喜欢两个布尔字段,但没有很好的理由不这样做。
https://stackoverflow.com/questions/23905435
复制相似问题