Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在sql中,有没有办法将一列的多个值加载到一行的新行中_Python_Sql_Sql Insert - Fatal编程技术网

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。