2

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

SELECT name
FROM users
WHERE city LIKE '%blahblah%';

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

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

我尝试使用

SELECT name
FROM users
WHERE city LIKE '%%{variable-name}%';

但它不能像那样正确扩展,而且显然是不正确的。

我想要实现的最终查询是

...
WHERE city LIKE '%blahblah%';

因此它与存储在表中的包含“blahblah”的较长字符串匹配,但我希望变量动态扩展为正确的查询。有没有办法做到这一点?

谢谢!

4

2 回答 2

1

胡乱猜测:

假设 FreeRADIUS 在将 SQL 发送到 PostgreSQL 之前,对整个 SQL 字符串进行了愚蠢的替换,没有尝试解析文字等,那么您可以使用:

SELECT name
FROM users
WHERE city LIKE '%'||'%{variable-name}'||'%';

编辑:为避免 FreeRADIUS 解析不够巧妙引起的警告,请将%s 隐藏为十六进制字符:

WHERE city LIKE E'\x25%{variable-name}\x25';

注意字符串的前导,将其标记为要进行转义处理E的字符串。

于 2014-07-28T07:52:50.947 回答
0
SELECT name
FROM users
WHERE city LIKE '%%'||'%{variable-name}'||'%%';

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

于 2014-08-07T00:09:33.810 回答