Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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 server 如何删除字符“;”左侧的字符串和包含的字符串'U',然后显示它?_Sql Server - Fatal编程技术网

Sql server 如何删除字符“;”左侧的字符串和包含的字符串'U',然后显示它?

Sql server 如何删除字符“;”左侧的字符串和包含的字符串'U',然后显示它?,sql-server,Sql Server,我有一个表和这样的值 000001U;000002;000003U;000004;000005U;000006U 我想显示这个字段是什么样子的 000002;000004; 适用于SQL Server 2016及更高版本 select stuff ( (select ',' + value from STRING_SPLIT ('000001U;000002;000003U;000004;000005U;000006U'

我有一个表和这样的值

000001U;000002;000003U;000004;000005U;000006U
我想显示这个字段是什么样子的

000002;000004;

适用于SQL Server 2016及更高版本

select  stuff (
               (select ',' + value
                from    STRING_SPLIT  ('000001U;000002;000003U;000004;000005U;000006U', ';')
                where   right(value, 1) <> 'U'
                 for    xml path('')), 
                1, 1, '')

对于早期版本,您可以使用Jeff Moden提供的任何CSV拆分器,如注释中所述,SQL Server不支持任何本机正则表达式替换。但是,如果您可以获得整个表/列的转储,那么您可以在另一个工具(如记事本+)中轻松地替换正则表达式

请查找此模式:

[0-9]+U;?
然后用空字符串替换。这将为每一行留下您想要查看的数据。下面是一个演示,演示了如何在Java中使用它

试试这个

DECLARE @Table AS TABLE (Data nvarchar(1000))
INSERT INTO @Table
SELECT '000001U;000002;000003U;000004;000005U;000006U'

SELECT STUFF((SELECT '; '+Data
FROM
(
SELECT Split.a.value('.','nvarchar(1000)') AS Data
FROM
(
SELECT 
   CAST('<S>'+REPLACE(Data,';','</S><S>') +'</S>' AS XML ) AS Data
 FROM @Table
)AS A 
CROSS APPLY Data.nodes('S') AS Split(a)
)dt 
WHERE CHARINDEX('U',Data)=0 FOR XML PATH('')),1,1,'') AS Data

简单的方法是通过IsNumeric函数确定值

DECLARE @GIVEN VARCHAR(MAX)='000001U;000002;000003U;000004;000005U;000006U';
DECLARE @FINAL VARCHAR(MAX)='';

SELECT @FINAL =@FINAL+ case when ISNUMERIC(val)=1 then val+';' else '' end FROM (
SELECT split.x.value('.','varchar(max)') VAL FROM(
SELECT CAST('<M>'+REPLACE(@GIVEN,';','</M><M>')+'</M>'  AS XML) AS VAL
)A
CROSS APPLY a.VAL.nodes('/M') as split(x)
)AA

PRINT @FINAL

结果:000002;000004;

这里您真正需要的是一个正则表达式替换。但不幸的是,SQL Server不支持这种开箱即用的方式。您可能可以使用UDF。但一般来说,您不应该像这样存储非规范化的数据。。。你可以搜索它,然后替换为空字符串。你能举例说明如何使用正则表达式吗?对不起,我使用的是sql server
DECLARE @GIVEN VARCHAR(MAX)='000001U;000002;000003U;000004;000005U;000006U';
DECLARE @FINAL VARCHAR(MAX)='';

SELECT @FINAL =@FINAL+ case when ISNUMERIC(val)=1 then val+';' else '' end FROM (
SELECT split.x.value('.','varchar(max)') VAL FROM(
SELECT CAST('<M>'+REPLACE(@GIVEN,';','</M><M>')+'</M>'  AS XML) AS VAL
)A
CROSS APPLY a.VAL.nodes('/M') as split(x)
)AA

PRINT @FINAL