更新表格单元格以仅具有唯一值
Posted
技术标签:
【中文标题】更新表格单元格以仅具有唯一值【英文标题】: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 中操作这些数据,然后使用基于相同 sid
s 的 UPDATE
语句更新记录
关于在 SQL 中完成此任务的任何建议?
【问题讨论】:
@a_horse_with_no_name 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)
【讨论】:
array_unique 函数归功于这篇文章:***.com/a/41725011/341959以上是关于更新表格单元格以仅具有唯一值的主要内容,如果未能解决你的问题,请参考以下文章