正则表达式将空格分隔列表转换为SQL where子句

时间:2010-02-01 14:22:56

标签: sql regex sas sas-macro

我几乎感到尴尬,但我正在努力创建一个正则表达式来将cat dog mouse之类的内容更改为SQL where子句:

a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse

s/(\w*)\s?/a.$1=b.$1 AND /

我得到了

a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse AND a.=b. AND

哎哟。帮助赞赏。

编辑:我最终使用了两个连续的正则表达式。由于我在SAS宏中需要这个,并且我希望我的代码简洁,我写了这个宏:

%Macro rxchange(str,rx1,rx2,rx3,rx4,rx6,rx7,rx8,rx9,rx10);
    %Let rxno=1;
    %Do %While("&&rx&rxno" Ne "");
        %Let str=%SysFunc(PRXChange(%Str(&&rx&rxno), -1, %Str(&str)));        
        %Let rxno=%Eval(&rxno+1);
    %End;
    &str
%Mend;

/* Try this: */
%Put %rxchange(cat dog mouse,s/(\w+)\s?/a.$1=b.$1 /,s/(\s+)/ AND /);

感谢所有回复的人!

4 个答案:

答案 0 :(得分:3)

您的第一个问题是,您需要+而不是*

s/(\w+)\s?/a.$1=b.$1 AND /

这将解决a.=b.

的问题

即使这样,你也会得到AND太多。你可以用最后的'1 = 1'解决这个问题。

你确定要在这里使用正则表达式,而不是分割,简单的字符串操作,然后是连接吗?我想这会更容易理解。

答案 1 :(得分:2)

您可以按空格拆分行,执行s/^(.+)$/a.$1=b.$1/(不要在这种情况下使用正则表达式),然后加入数组“separator”“AND”。

确保在开始之前修剪字符串。结束空格是额外a.=b.的原因。

答案 2 :(得分:1)

我可以用2个正则表达式命名这个曲调!

str = prxchange('s/(\w+)/a.$1=b.$1/', -1, str);
str = prxchange('s/ +/ AND /', -1, str);

答案 3 :(得分:1)

你可以使用两个正则表达式,一个匹配第一个单词以外的所有表达式,另一个匹配第一个单词。

C#代码:

string where = "cat dog mouse";
where = Regex.Replace(where, @" (\w+)", " AND a.$1=b.$1");
where = Regex.Replace(where, @"^(\w+)", "a.$1=b.$1");