将表格单元格更新为仅具有唯一值

时间:2017-07-20 23:49:50

标签: sql postgresql

我有一个带有grade_range列的数据库表,此列的行包含重复值,所有值都以逗号分隔(如列表)。

grade_range
"Pre-K, Pre-K, Pre-K"
"Pre-K, K-9, K-9"
"Pre-K, K-7, 9-12"
"Pre-K, K-7, K-7"
"Pre-K, K-6"
"Pre-K, K-5"

我想更新这些记录,以便我只留下此列行中的唯一值,如下所示

grade_range
"Pre-K"
"Pre-K, K-9"
"Pre-K, K-7, 9-12"
"Pre-K, K-7"
"Pre-K, K-6"
"Pre-K, K-5"

使用 -

可以在SQL中轻松选择不同的列值
SELECT DISTINCT grade_range FROM dev.school

但是,我不确定如何在行单元格内选择/更新不同的值。我想做的一种方法是在Excel中操作这些数据,然后使用基于相同UPDATE的{​​{1}}语句更新记录

有关在SQL中完成此操作的任何建议吗?

2 个答案:

答案 0 :(得分:1)

使用此函数将逗号分隔值转换为行 然后使用distince然后再连接它们

ALTER FUNCTION [dbo].[Split]
    (
        @List varchar(max),
        @SplitOn nvarchar(5)
    )  
    RETURNS @RtnValue table 
    (

        ID int identity(1,1),
        Val varchar(max)
    ) 
    AS  
    BEGIN 
        While (Charindex(@SplitOn,@List)>0)
        Begin

            Insert Into @RtnValue (Val)
            Select 
                Val = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
        End

        Insert Into @RtnValue (Val)
        Select Value = ltrim(rtrim(@List))

        Return
    END

答案 1 :(得分:1)

<强>第一。创建一个区分数组的函数

打开psql。在psql里面输入\ef。用此功能替换内容:

CREATE OR REPLACE FUNCTION public.array_unique(arr anyarray)
RETURNS anyarray 
LANGUAGE sql AS 
$function$
  select array( select distinct unnest($1) )
$function$

<强>第二。玩游戏

假设每个元素不断用逗号和空格分隔。我们可以将每行拆分为数组格式,将其与先前的函数区分开来,然后将其转换回字符串。

SELECT 
   array_to_string(array_unique(regexp_split_to_array(grade, E', ')), ',') as grade_distinct, 
   grade 
FROM 
   your_table;

<强>结果

localhost:5432 user@database=# 
SELECT 
   array_to_string(array_unique(regexp_split_to_array(grade, E', ')), ',') as grade_distinct, 
   grade 
FROM 
   tmp_stack_overflow;

 grade_distinct |        grade        
----------------+---------------------
 Pre-K          | Pre-K, Pre-K, Pre-K
 Pre-K,K-9      | Pre-K, K-9, K-9
 Pre-K,K-7,9-12 | Pre-K, K-7, 9-12
 Pre-K,K-7      | Pre-K, K-7, K-7
 K-6,Pre-K      | Pre-K, K-6
 K-5,Pre-K      | Pre-K, K-5
(6 rows)