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
T-SQL如何将逗号分隔的数字字符串转换为整数_Sql_String_Comma_Delimited - Fatal编程技术网

T-SQL如何将逗号分隔的数字字符串转换为整数

T-SQL如何将逗号分隔的数字字符串转换为整数,sql,string,comma,delimited,Sql,String,Comma,Delimited,我收到错误“将nvarchar值'23,24,3,45,91'转换为int数据类型时转换失败”。错误似乎发生在on子句上。E.ID是一个整数字段,而F.Legassise是一个由逗号分隔的整数组成的varchar字段。下面是出现该错误的代码 SELECT F.[FDTitle], E.PrimaryOpID as [FD Primary OP ID], F.County as [FD County], F.Status as [FD Status], F.IssueDate as [FD Dat

我收到错误“将nvarchar值'23,24,3,45,91'转换为int数据类型时转换失败”。错误似乎发生在on子句上。E.ID是一个整数字段,而F.Legassise是一个由逗号分隔的整数组成的varchar字段。下面是出现该错误的代码

SELECT F.[FDTitle], E.PrimaryOpID as [FD Primary OP ID], F.County as [FD County], F.Status as [FD Status], F.IssueDate as [FD Date]
FROM [dbo].[tbl_FinalDetMain] F
LEFT OUTER JOIN [dbo].[tbl_lk_Exemptions_FD] E ON E.ID = F.LegalIssue
WHERE F.[FDNbr] = '2013-0041'
我已经为on子句尝试了下面的代码,但它只返回一个整数值,而不是整串整数

E.ID = cast(LEFT(F.LegalIssue,PATINDEX('%[^0-9]%',F.LegalIssue)-1) as int)

结果应包括五个以逗号分隔的整数

您要么将F.legalise规范化为多行,要么使用类似的

差不多

    CAST(E.ID A VARCHAR(50)) = F.LegalIssue
OR  F.LegalIssue LIKE CAST(E.ID A VARCHAR(50)) + ',%'
OR  '%,' + F.LegalIssue LIKE CAST(E.ID A VARCHAR(50)) + ',%'
OR  '%,' + F.LegalIssue LIKE CAST(E.ID A VARCHAR(50))
如您所见,表的实际设计是问题所在。您应该避免当前的设计,选择
1对多
多对多
设计

下面是如何使用递归CTE展平值的演示

创建测试表和数据

CREATE TABLE Tada(
  ID INT,
  SomeCommaString VARCHAR(50)
  )
INSERT INTO Tada Values (1, '10'),(2,'5,6,12,16')
把桌子弄平

;WITH Vals AS (
  SELECT 
      ID,
      CASE
          WHEN CHARINDEX(',',SomeCommaString) = 0
            THEN SomeCommaString
          WHEN CHARINDEX(',',SomeCommaString) > 0
            THEN LEFT(SomeCommaString,CHARINDEX(',',SomeCommaString) - 1)
      END Val,

      CASE
          WHEN CHARINDEX(',',SomeCommaString) > 0
            THEN RIGHT(SomeCommaString,LEN(SomeCommaString) - CHARINDEX(',',SomeCommaString))
          ELSE NULL
      END Remainder
  FROM Tada
  UNION ALL
  SELECT 
      ID,
      CASE
          WHEN CHARINDEX(',',Remainder) = 0
            THEN Remainder
          WHEN CHARINDEX(',',Remainder) > 0
            THEN LEFT(Remainder,CHARINDEX(',',Remainder) - 1)
      END Val,

      CASE
          WHEN CHARINDEX(',',Remainder) > 0
            THEN RIGHT(Remainder,LEN(Remainder) - CHARINDEX(',',Remainder))
          ELSE NULL
      END Remainder

  FROM Vals
  WHERE Remainder IS NOT NULL
)
SELECT ID, Val
FROM Vals

如果
legasisue
包含一个逗号分隔的数字字符串,那么您确实需要一个关联表。缺少这一点,以下是一种方便(但不是有效)的连接方式:

SELECT F.[FDTitle], E.PrimaryOpID as [FD Primary OP ID], F.County as [FD County],
       F.Status as [FD Status], F.IssueDate as [FD Date]
FROM [dbo].[tbl_FinalDetMain] F LEFT OUTER JOIN
      [dbo].[tbl_lk_Exemptions_FD] E
      ON ','+F.LegalIssue+',' like '%,'cast(E.ID as varchar(255))+',%'
WHERE F.[FDNbr] = '2013-0041';

这会在列表前后加逗号以避免冲突,例如在“11001000”中查找“10”。

使用xml数据类型,可以将字符串分解为如下所示的整数。对于用户定义的函数,我会说:-)

declare@test varchar(最大值)
设置@test='1,2,3,4,5'
挑选
T2.item.value('(./text())[1]',int')
从…起
(选择转换(xml,“+替换(@test,”,“)+”)为xmldoc)
作为xmltable
交叉应用xmltable.xmldoc.nodes('/items/t')作为T2(item)

请停止在单个列中存储逗号分隔的列表。你可能认为这是一个聪明和有用的设计,但它造成的问题多于它解决的问题。数据库不是JSON容器!
declare @test varchar(max)

set @test = '1,2,3,4,5'

select 
     T2.item.value('(./text())[1]','int') 
from
     (select convert(xml,'<items><t>'+replace(@test,',','</t><t>')+'</t></items>') as xmldoc)
as xmltable
     CROSS APPLY xmltable.xmldoc.nodes('/items/t') as T2(item)