当前位置: 首页 > 面试题库 >

在Postgres中将通用位字符串与零进行比较

严令秋
2023-03-14
问题内容

有没有一种方法可以在不对位串宽度为0进行硬编码的情况下进行非零位串测试?

例如,假设我有两个表,Users和Features,每个表都带有掩码,我想对此进行测试:

SELECT u.name FROM Users u, Features f
  WHERE u.mask & f.mask;

匹配隐式非零结果。但是,SQL需要一个显式的布尔结果,WHERE而不是隐式的强制转换,例如:

SELECT u.name FROM Users u, Features f
  WHERE (u.mask & f.mask) != 0::BIT(2048);

由于多种原因,我不想2048在此查询中进行硬编码(或其他任何方式)。

测试expr = 0expr > 0导致类型错误。奇怪的是,我可以测试expr = 0::BIT(1),但这给出了错误的答案,因为Postgres并不认为所有全零位字符串都相等。

select 0::BIT(2) > 0::BIT(1);
 ?column? 
----------
 t
(1 row)

我可以通过执行以下操作来创建计算出的零:

SELECT u.name FROM Users u, Features f
  WHERE (u.mask & f.mask) != (u.mask & ~u.mask);

哪个可行,但感觉很糟糕。

有什么建议或见解吗?

结果

我对下面提供的几个选项进行了基准测试。感谢您的建议,欧文!

基于一个非常大的数据集和100,000个查询,我发现以下结构导致每秒相关的查询。希望Postgres团队的人看到了这一点,并提供了通用0以加快处理速度!不幸的是,大多数通用方法似乎都导致了字符串转换,这是非常昂贵的。

Constructs                              |  Queries / s
----------------------------------------+--------------
(u.mask & f.mask) <> 0::BIT(2048)       |  158
(u.mask & f.mask) <> (u.mask # u.mask)  |  135
(u.mask & f.mask) <> (u.mask & ~u.mask) |  125
position('1' IN (u.mask & f.mask)) > 0  |   37
(u.mask & f.mask)::TEXT !~ '^0+$'       |   27

问题答案:

短位串

要排除按位AND(&返回由零组成的位串,但长度可能会更改(B'000...')的情况,可以使用强制转换为integer(最多bit(32))或bigint(最多bit(64)):

SELECT u.name
FROM   users u
JOIN   features f ON (u.mask & f.mask)::int <> 0;

转换为整数时,所有结果都为0
这也排除了其中任一列为的情况NULL。换句话说,结果必须包括至少一个1

长位串

如果您的值可以大于64位,则可以将其强制转换text为正则表达式并进行检查:

ON (u.mask & f.mask)::text !~ '^0+$'

模式说明:

^ ..字符串的开头
0+..一个或多个‘0’
$ ..字符串的结尾

或者,如手册所告知:

下面的SQL标准的功能对位串工作,以及字符串:lengthbit_lengthoctet_lengthpositionsubstringoverlay

Ergo:

ON position('1' IN (u.mask & f.mask)) > 0


 类似资料:
  • 我试图编写一个程序,其中我必须做与模板(本质上是一个字符串)之间的字符串列表的比较。我不知道什么是使用的术语,但它将是更多的日志刮削程序,如果这是有帮助的。 null 这个想法是将输入语句(1-4)与模板字符串(a-b)匹配,如果它们匹配,那么我需要对它们进行操作。Like 1和4匹配句子b,但2不匹配。 提前感谢您的帮助/指示。

  • 我有一个关于Java中字符串的简单问题。下面的简单代码段只是将两个字符串连接起来,然后将它们与进行比较。 比较表达式返回非常明显(我理解和之间的区别)。 当这两个字符串声明为时, 比较表达式在本例中返回。为什么会起作用?是不是一定要用实习生的钱呢?还是我被误导了?

  • 问题内容: 这个问题已经在这里有了答案 : Python If == true语句仅在readline的最后一行有效 (1个答案) 2年前关闭。 我试图将我的一行与一个字符串进行比较,但是这行不通。我正在读取一个html文件,我需要解析该文件以将该部分发送到字典,但是当我使用if将行之一与字符串进行比较时,匹配时不会返回True。 这是代码: 问题答案: 我认为这是因为它尝试读取字符串中的换行符:

  • 如何比较两个列表是否相等验证数据来自Excel工作表。我需要验证两个列表是否相同,并且列表中没有附加元素或缺少元素。我不需要对列表进行排序。打印输出CAGID Excel data=CAGID Web列表

  • 以下代码的输出为假 我不明白。我想它会返回true。在我为SCJP做准备时,了解其背后的原因可能会有所帮助。有人能帮忙吗?

  • 我使用以下sql将字符串与日期oracle进行比较,但得到的结果不正确。我尝试了to\u date、to\u char选项,但没有得到任何正确的结果。 地点日期1:10-JUN-2101.00.00.000000000 AM日期2:10-JUN-2021 01:00 上述sql返回上述Date1和Date2的行,尽管它们相等。Date1也是varchar格式,Date2是带有本地时区格式的时间戳(