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