如何使用LIKE运算符匹配PostgreSQL中FreeRADIUS中的变量?

如何使用LIKE运算符匹配PostgreSQL中FreeRADIUS中的变量?,postgresql,sql-like,freeradius,Postgresql,Sql Like,Freeradius,在FreeRADIUS执行的PostgreSQL查询中,我想做一些类似的事情(表名和值只是示例): 但有一个问题:blahblah值包含在FreeRADIUS变量中,用“{variable name}”表示。它扩展为“blahblah” 现在我的问题是:如何使用LIKE运算符将%{variable name}变量与表中存储的值相匹配 我试着用 SELECT name FROM users WHERE city LIKE '%%{variable-name}%'; 但它不能像那样正确地展开,显然

在FreeRADIUS执行的PostgreSQL查询中,我想做一些类似的事情(表名和值只是示例):

但有一个问题:blahblah值包含在FreeRADIUS变量中,用“{variable name}”表示。它扩展为“blahblah”

现在我的问题是:如何使用LIKE运算符将%{variable name}变量与表中存储的值相匹配

我试着用

SELECT name
FROM users
WHERE city LIKE '%%{variable-name}%';
但它不能像那样正确地展开,显然是不正确的

我想实现的最后一个查询是

...
WHERE city LIKE '%blahblah%';
因此,它与表中存储的包含“blahblah”的较长字符串相匹配,但我希望该变量动态扩展到正确的查询中。有办法吗

谢谢

胡乱猜测:

假设在将SQL发送到PostgreSQL之前,FreeRADIUS正在对整个SQL字符串进行哑替换,而不尝试解析文本等,那么您可以使用:

SELECT name
FROM users
WHERE city LIKE '%'||'%{variable-name}'||'%';
编辑:为了避免FreeRADIUS解析不够巧妙而导致的警告,请将
%
隐藏为十六进制字符:

WHERE city LIKE E'\x25%{variable-name}\x25';
注意字符串的前导
E
,该字符串将其标记为要进行转义处理的字符串


稍微干净一点
%%
是FreeRADIUS的百分比转义序列。

那么,
%%{variable name}
的值
blahblah
来自哪里?请给出一个完整的示例,最好是表格的CREATETABLE和insert语句。FreeRADIUS是否检测到这些变量字符串并将其直接替换到SQL中?您希望在PostgreSQL中执行此操作吗?还有,“无法正确扩展”是如何实现的?“明显不正确”怎么说?执行什么SQL?这是我添加到freeradius的authorize部分的一个查询,用于清理过时的会话。如果新的身份验证请求来自同一MAC地址,则可以删除acctstoptime为空的会话。由于我的NAS无法在记帐请求数据包中为radius服务器提供“呼叫站Id”(wifi站的MAC)字段,freeradius在记帐插入期间没有将wifi站的MAC地址存储在callingstationid列中。因此,我修改了accounting_start查询,改为在radacct表的callingstationid列中插入Acct多会话Id。Acct Multi Session Id包含站点的MAC,但它是一个较长的字符串,另外还包含NAS的MAC。因此,在我的会话清理查询中,我需要一个更新,使%{Calling Station Id}变量(在查询运行之前动态扩展为FreeRADIUS)与修改后的callingstationid列中的Acct多会话Id值相匹配。因此,我按照您的建议进行了更新:UPDATE radacct set AcctStopTime=(“%S”::timestamp-”{%{Acct Delay Time}:-0}'::interval),AcctTerminateCause='Clear-Stale Session',其中UserName='%{User Name}'和CallingStationId类似''''.|'%{呼叫站Id}“| |”%”和AcctStopTime为NULL;关闭陈旧会话,它工作了。谢谢!谢谢,它工作了!它对未知“%”变量发出了两个警告警告警告:未知变量“%”:请参阅“doc/variables.txt”警告:未知变量“%”:请参阅“doc/variables.txt”但它工作了!查询正确展开
UPDATE radacct set AcctStop时间=('2014-07-28 11:38:11'::时间戳-'0'::间隔),accterMinateCause='Clear-Stale Session',其中UserName='cleaver'和CallingStationId像'''.'CC-FA-00-C6-4A-A6'.'一样,AcctStopTime为NULL;
它执行任务,清理陈旧的会话。@StoychoGanev请参阅编辑以了解如何避免警告。不,这是扩展的查询。
更新radacct set AcctStopTime=('2014-07-28 12:20:43'::时间戳-'0'::间隔),AcctTerminateCause='Clear-Stale Session',其中UserName='cleaver'和CallingStation像E'x25CC-FA-00-C6-4A-A6x25',AcctStopTime为NULL
似乎无法解析反斜杠,并且
查询受影响的行=0
愚蠢的东西一定在使用反斜杠。将它们加倍。然后请针对freeradius报告错误。我们所有人这太糟糕了。它应该使用参数化查询。非常感谢。将反斜杠增加一倍就成功了。尽管涉及到肮脏的黑客,但查询现在正在产生预期的结果。再次感谢!
WHERE city LIKE E'\x25%{variable-name}\x25';
SELECT name
FROM users
WHERE city LIKE '%%'||'%{variable-name}'||'%%';