在SQL中,如何删除前三个字符(CN =)以及逗号后面跟着“ OU”的所有内容(从报表上显示的内容,没有从数据库中删除的内容),这样我就剩下名称和最后一个名称在同一列中?例如:
CN=Tom Chess,OU=records,DC=1234564786_data for testing, 1234567
CN=Jack Bauer,OU=records,DC=1234564786_data for testing, 1234567
CN=John Snow,OU=records,DC=1234564786_data for testing, 1234567
CN=Anna Rodriguez,OU=records,DC=1234564786_data for testing, 1234567
所需显示:
Tom Chess
Jack Bauer
John Snow
Anna Rodriguez
我尝试过与TRIM一起玩,但是我不知道如何声明位置,并且姓名和姓氏的长度不同,我真的不知道该如何处理。
提前谢谢
更新:我想知道一种使用“定位”来匹配逗号位置,然后将其提供给子字符串的方法。不确定类似的方法是否可行,也不确定如何将语法组合在一起。你怎么看?这是可行的方法吗?
答案 0 :(得分:2)
您可以尝试这个SUBSTRING(ColumnName, 4, CHARINDEX(',', ColumnName) - 4)
答案 1 :(得分:1)
在Postgres中,假设没有名称包含split_part()
,您可以使用,
select substr(split_part(the_column, ',', 1), 4)
from ...
答案 2 :(得分:1)
LUW的Db2 11.x:
with tab (str) as (values
' CN = Tom Chess , OU = records,DC=1234564786_data for testing, 1234567'
, 'CN=Jack Bauer,OU=records,DC=1234564786_data for testing, 1234567'
, 'CN=John Snow,OU=records,DC=1234564786_data for testing, 1234567'
, 'CN=Anna Rodriguez,OU=records,DC=1234564786_data for testing, 1234567'
)
select REGEXP_REPLACE(str, '^\s*CN\s*=\s*(.*)\s*,\s*OU\s*=.*', '\1')
from tab;
请注意,这种正则表达式模式允许任意数量的空格,如上面示例的第1条记录中所示。
答案 3 :(得分:0)
在Oracle 11g中,它可能会起作用。
REGEXP_SUBSTR(REGEXP_SUBSTR(COLUMN_NAME, '[^CN=]+',1,1),'[^,OU]+',1,1)
答案 4 :(得分:0)
我认为必须有一个循环来处理这个问题。这是SQL Server函数,它将对此进行解析。 (我知道这个问题并未指定SQL Server,但这是如何完成此操作的一个示例。)
select dbo.ScrubFieldValue(value) from table
将返回您要查找的内容
CREATE FUNCTION ScrubFieldValue
(
@Input varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @retval varchar(8000)
DECLARE @charidx int
DECLARE @remaining varchar(8000)
DECLARE @current varchar(8000)
DECLARE @currentLength int
select @retval = ''
select @remaining = @Input
select @charidx = CHARINDEX('CN=', @remaining,2)
while(LEN(@remaining) > 0)
BEGIN
--strip current row from remaining
if (@charidx > 0)
BEGIN
select @current = SUBSTRING(@remaining, 1, @charidx - 1)
END
else
BEGIN
select @current = @remaining
END
select @currentLength = LEN(@current)
-- get current name
select @current = SUBSTRING(@current, 4, CHARINDEX(',OU', @current)-4)
select @retval = @retval + @current + ' '
-- strip off current from remaining
select @remaining =substring(@remaining,@currentLength + 1,
LEN(@remaining) - @currentLength)
select @charidx = CHARINDEX('CN=', @remaining,2)
END
RETURN @retval
END
答案 5 :(得分:0)
在我的DB2 Z / OS版CHARINDEX上抛出语法错误。解决此问题的方法有两种。
SUBSTRING(ColumnName, 4, INSTR(ColumnName,',',1) - 4)
SUBSTRING(ColumnName, 4, LOCATE_IN_STRING(ColumnName,',') - 4)
我应该补充一点,该版本为V12R1
答案 6 :(得分:0)
如果输入str的格式正确(即看起来像您的示例数据,没有任何其他标记,例如空格),则可以使用以下内容:
substr(str,locate('CN=', str)+length('CN='), locate(',', str)-length('CN=')-1)
如果您的Db2版本支持REGEXP,那是一个更好的选择。