【问题标题】:update table cells to only have unique values更新表格单元格以仅具有唯一值
【发布时间】:2017-07-20 23:49:49
【问题描述】:

我有一个带有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 中操作这些数据,然后使用基于相同 sids 的 UPDATE 语句更新记录

关于在 SQL 中完成此任务的任何建议?

【问题讨论】:

  • @a_horse_with_no_name PostgreSQL 兄弟

标签: sql postgresql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    第一。创建一个函数来区分数组

    打开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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多