有没有一种方法可以在不对位串宽度为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 = 0
或expr > 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标准的功能对位串工作,以及字符串:
length
,bit_length
,octet_length
,position
,substring
,overlay
。
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是带有本地时区格式的时间戳(