Python 在sql中,有没有办法将一列的多个值加载到一行的新行中
这就是我的数据的外观Python 在sql中,有没有办法将一列的多个值加载到一行的新行中,python,sql,sql-insert,Python,Sql,Sql Insert,这就是我的数据的外观 emp_id,skills 1234,python|java|sql|R|javascript 5639,C|HTML|php|perl 这就是数据需要加载到表中的方式 emp_id skills python 1234 java sql R perl C 5639 HTML php 实际上,我已将|替换为\n,但它不会在下一行中加载,而只是通
emp_id,skills
1234,python|java|sql|R|javascript
5639,C|HTML|php|perl
这就是数据需要加载到表中的方式
emp_id skills
python
1234 java
sql
R
perl
C
5639 HTML
php
实际上,我已将|替换为\n,但它不会在下一行中加载,而只是通过添加空格来加载。
我将使用python etl将数据加载到表中,这样即使是后处理也可以添加。
有什么建议吗?这是关系数据库的行为,它不能只在每个组中显示一次emp_id,并且在每个行中显示一个emp_id。改变这种显示数据的方式是前端的特权和责任,而不是数据库的。在Python中也可以这样做 说到这里,Impala有一个SPLIT_PART string函数,它返回字符串的第n个标记,该标记由分隔符分隔,并作为参数传递 所以,用一系列连续的整数交叉连接,然后应用SPLIT_PARTskills,“|”,我做你需要的 实际上,在我从不太谦虚的观点中,每当有人向您抛出一个格式如此不满意的文件以加载到数据库中时,您都应该这样做。始终使用以下技术垂直校准逗号/条形/分号/或任意分隔的值列表,并存储垂直校准的数据:
WITH
-- your input
input( emp_id,skills) AS (
SELECT 1234,'python|java|sql|R|javascript'
UNION ALL SELECT 5639,'C|HTML|php|perl'
)
,
-- a big enough series of integers ..
i(i) AS (
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
)
SELECT
emp_id
, SPLIT_PART(skills,'|',i) AS skill
FROM input
CROSS JOIN i
WHERE SPLIT_PART(skills,'|',i) <> ''
ORDER BY
emp_id
, i
;
-- out emp_id | skill
-- out --------+------------
-- out 1234 | python
-- out 1234 | java
-- out 1234 | sql
-- out 1234 | R
-- out 1234 | javascript
-- out 5639 | C
-- out 5639 | HTML
-- out 5639 | php
-- out 5639 | perl
对于两个以条形/逗号分隔的列,它可能如下所示:
WITH
-- your input, enhanced
input( emp_id,skills,pubs) AS (
SELECT 1234,'python|java|sql|R|javascript','ship inn,anchor,stag'
UNION ALL SELECT 5639,'C|HTML|php|perl' ,'black horse,crown,mitre'
)
,
-- a big enough series of integers ..
i(i) AS (
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
)
,
-- another big enough series of integers ..
j(j) AS (
SELECT
i AS j
FROM i
)
SELECT
emp_id
, i AS skill_sequence
, SPLIT_PART(skills,'|',i) AS skill
, j AS pub_sequence
, SPLIT_PART(pubs,',',j) AS pub
FROM input
CROSS JOIN i
CROSS JOIN j
WHERE SPLIT_PART(skills,'|',i) <> ''
AND SPLIT_PART(pubs, ',',j) <> ''
ORDER BY
emp_id
, i
, j
;
-- out emp_id | skill_sequence | skill | pub_sequence | pub
-- out --------+----------------+------------+--------------+-------------
-- out 1234 | 1 | python | 1 | ship inn
-- out 1234 | 1 | python | 2 | anchor
-- out 1234 | 1 | python | 3 | stag
-- out 1234 | 2 | java | 1 | ship inn
-- out 1234 | 2 | java | 2 | anchor
-- out 1234 | 2 | java | 3 | stag
-- out 1234 | 3 | sql | 1 | ship inn
-- out 1234 | 3 | sql | 2 | anchor
-- out 1234 | 3 | sql | 3 | stag
-- out 1234 | 4 | R | 1 | ship inn
-- out 1234 | 4 | R | 2 | anchor
-- out 1234 | 4 | R | 3 | stag
-- out 1234 | 5 | javascript | 1 | ship inn
-- out 1234 | 5 | javascript | 2 | anchor
-- out 1234 | 5 | javascript | 3 | stag
-- out 5639 | 1 | C | 1 | black horse
-- out 5639 | 1 | C | 2 | crown
-- out 5639 | 1 | C | 3 | mitre
-- out 5639 | 2 | HTML | 1 | black horse
-- out 5639 | 2 | HTML | 2 | crown
-- out 5639 | 2 | HTML | 3 | mitre
-- out 5639 | 3 | php | 1 | black horse
-- out 5639 | 3 | php | 2 | crown
-- out 5639 | 3 | php | 3 | mitre
-- out 5639 | 4 | perl | 1 | black horse
-- out 5639 | 4 | perl | 2 | crown
-- out 5639 | 4 | perl | 3 | mitre
用您正在使用的数据库标记您的问题。然后,修复数据模型。不要在字符串中存储多个值。您可以使用JSON,但正确的关系模型将使用连接表。Gordon,您认为任何后期处理对python有帮助吗。不,我认为SQL中合适的数据模型会有所帮助。我对Python中发生的事情不太敏感。假设我还有一个类似于列的技能,那么我该如何继续呢?我刚刚添加了一个新列:pubs,这次用逗号分隔。您需要从I中选择第二个整数序列,并将列重命名为j-并与该整数交叉连接。我将其添加到响应中。如果在输入中有3、4个或更多的兽类,则必须考虑每一个多值字符串创建一个单独的表:例如,创建表技能INPUPIDID INT外键引用输入、序列INT、技能VARCHAR32。