Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
SQL基于一个或多个可能的分隔符拆分列,并在新表中插入_Sql_Ms Access_Split_Ms Access 2010 - Fatal编程技术网

SQL基于一个或多个可能的分隔符拆分列,并在新表中插入

SQL基于一个或多个可能的分隔符拆分列,并在新表中插入,sql,ms-access,split,ms-access-2010,Sql,Ms Access,Split,Ms Access 2010,我目前正在MS Access 2010中开发一个SQl,它可以基于分隔符(,)拆分列。在我要拆分的列中,可以有零、一、二或三个分隔符。我发现,如果只有一个分隔符(请参见问题末尾的SQL),但如果有多个分隔符,则无法拆分列 SQL基于下表。此表填充了表中可能出现的数据 ID column_value --------------------- 1 2, 44 2 1 3 8, 9, 4 4 7 我希望以这样一

我目前正在MS Access 2010中开发一个SQl,它可以基于分隔符(,)拆分列。在我要拆分的列中,可以有零、一、二或三个分隔符。我发现,如果只有一个分隔符(请参见问题末尾的SQL),但如果有多个分隔符,则无法拆分列

SQL基于下表。此表填充了表中可能出现的数据

ID         column_value
---------------------
1          2, 44
2          1
3          8, 9, 4
4          7
我希望以这样一种方式拆分列“value”,即创建一个新表。列“ID”相同不是问题,因为这不是主键

ID         value
---------------------
1          2
1          44
2          1
3          8
3          9
3          4
4          7
我试图从更改SQL,但它仅在只有1个分隔符(,)时有效,因为它使用了函数LEFT和MID。如果列中有超过1个分隔符,我找不到如何以可以拆分的方式更改它。如果有一个分隔符,我用来拆分的SQL:

  select * into importeddata
from (SELECT column_value, id
  FROM SourceData
  WHERE InStr(column_value, ',') = 1
  UNION ALL
  SELECT Left(column_value, InStr(column_value, ',') - 1), id
  FROM SourceData
  WHERE InStr(column_value, ',') > 0
  UNION ALL
  SELECT mid(column_value, InStr(column_value, ',')+1 ), id
  FROM SourceData
  WHERE InStr(column_value, ',') > 0) AS CleanedUp;

如果有多个分隔符,有人知道如何拆分列吗?

要拆分并获取特定值,我更喜欢使用用户定义的函数

公共函数SplitString(str作为字符串,分隔符作为字符串,计数作为整数)作为字符串
Dim strArr()作为字符串
strArr=Split(str,分隔符,计数+1)
计数=计数-1'零基
如果UBound(strArr)>=计数,则
SplitString=strArr(计数)
如果结束
端函数
在此之后,您可以将SQL调整为以下内容:

SELECT * INTO importeddata
FROM (
SELECT SplitString(column_value, ',', 1), id
FROM SourceData
WHERE SplitString(column_value, ',', 1) <> ''
UNION ALL
SELECT SplitString(column_value, ',', 2), id
FROM SourceData
WHERE SplitString(column_value, ',', 2) <> ''
UNION ALL
SELECT SplitString(column_value, ',', 3), id
FROM SourceData
WHERE SplitString(column_value, ',', 3) <> ''
) AS A
导致以下表达式返回该字符串的第6个元素(仅限SQL):

《代码>IIf(InStr(InStr(InStr(InStr(1,'1,2,2,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,5,5,5,6,7,,,,,,,,,,,,,,,,,,,,,,)+莱文(1,“1,'1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,3,4,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 4,5,6,7',',')+Len(','),'1,2,3,4,5,6,7',',')+Len(','),'1,2,3,4,5,6,7',',')+Len(',')“1,2,3,3,4,4,4,3,3,3,3,4,5,5,6,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,","1,2,3,4,5,6,7","1,2,3,4,5,6,7","1,2,3,4,4,5,6,7","1,2,3,4,6,7","中"1,2,3,4,5,6,7",(InStr)(InStr(InStr)(InStr(InStr)(InStr)(InStr(InStr)(InStr)(InStr(1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,6,6,6,6,6,7',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,",","1,2,3,4,5,6,7","1,2,3,4,4,5,","1,2,3,4,6,",","1,2,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,","1,2,3,4,5,6,7", 将
SELECT
附加到它的开头,并将其作为一个查询执行,它将返回
6
,正如预期的那样。只有你有一个非常糟糕的查询,而使用UDF你只需要
SELECT SplitString(“1,2,3,4,5,6,7”,“,”6)


当然,您可以使用
generatesqlspilt
来创建查询(我确保如果该项不在字符串中,则返回一个空字符串,因此您可以使用它来测试是否存在第n个元素)。不过,我不建议这样做,因为查询会很长,效率低下,而且很难维护。

可能重复@Valerica在这个问题上,他的列有零个或一个分隔符。我正在寻找一个可以执行多个分隔符的SQL。它是类似的,但不是相同的。您在列中有一个值列表吗?@Valerica如果他已经没有我从那个问题中找到了答案,需要进一步的帮助,把它标记为duplicate@GordonLinoff如果您所指的列表是csv文件(或类似文件),我恐怕没有这个。我恐怕无法使用用户定义的函数,因为存在多个数据库的问题,即人们在只允许一个值的情况下插入多个值。(数据库模板中的错误)。真的在寻找一条其他人可以直接复制和粘贴的SQL语句,这样问题就解决了。请参阅我的编辑,了解如何执行该操作,以及为什么它是一个不好的工厂。您明确表示,只使用SQL是一个好主意。我花了一段时间才了解您的SQL语句中发生了什么以及它是如何创建的。这是糟糕的是,在我的情况下,用户定义的函数不是最好的解决方案,因为没有多少访问经验的人必须在没有我帮助的情况下完成。我目前正在考虑一个解决方案,在所有信息传输之前,我运行交替查询。但这根本不是一个干净的解决方案,所以我仍然在寻找还有更好的方法。如果你真的想在联合查询中使用,那么3次拆分还没有那么长:
IIf(InStr(InStr(1,column_value,,')+1,column_value,,')>0,IIf(InStr(InStr(InStr(1,column_value,,'))+1,column_value,,')<1,Mid(column_value,InStr(InStr(1,column_value,,,'))+1,column_value,,')+Mid替换
Len(',')后,
InStr
使用
1
。刚刚发现可以进行10次拆分,因此我必须找到另一种方法。但是您已经回答了我的问题,非常感谢!
Public Sub GenerateSQLSplit(str As String, Delimiter As String, Count As Integer)
    Dim i As Integer
    If Count = 1 Then
        Debug.Print "IIf(InStr(1, " & str & ", " & Delimiter & ") = -1, " & str & ", Left(" & str & ", InStr(1, " & str & ", " & Delimiter & ") - 1))"
    Else
        Dim strPrevious As String
        Dim strNext As String
        strPrevious = "InStr(1, " & str & "," & Delimiter & ")"
        i = Count - 1
        Do While i <> 1
            strPrevious = "InStr(" & strPrevious & " + Len(" & Delimiter & "), " & str & "," & Delimiter & ")"
            i = i - 1
        Loop
        strNext = "InStr(" & strPrevious & " + Len(" & Delimiter & "), " & str & " , " & Delimiter & ")"
        Debug.Print "IIf( " & strPrevious & "> 0, IIf(" & strNext & " < 1, Mid(" & str & ", " & strPrevious & " + Len(" & Delimiter & ")), Mid(" & str & ", " & strPrevious & " + Len(" & Delimiter & "), " & strNext & " - " & strPrevious & " - Len(" & Delimiter & "))), """") "
    End If
End Sub
GenerateSQLSplit "'1,2,3,4,5,6,7'", "','", 6
IIf( InStr(InStr(InStr(InStr(InStr(1, '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',')> 0, IIf(InStr(InStr(InStr(InStr(InStr(InStr(1, '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7' , ',') < 1, Mid('1,2,3,4,5,6,7', InStr(InStr(InStr(InStr(InStr(1, '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(',')), Mid('1,2,3,4,5,6,7', InStr(InStr(InStr(InStr(InStr(1, '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), InStr(InStr(InStr(InStr(InStr(InStr(1, '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7'
,',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7' , ',') - InStr(InStr(InStr(InStr(InStr(1, '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') + Len(','), '1,2,3,4,5,6,7',',') - Len(','))), "")