我有一个带有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中完成此操作的任何建议吗?
答案 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)