如何检查一个 int 是不是包含另一个 int 作为它的一部分?
Posted
技术标签:
【中文标题】如何检查一个 int 是不是包含另一个 int 作为它的一部分?【英文标题】:How to check if an int contains another one as part of it?如何检查一个 int 是否包含另一个 int 作为它的一部分? 【发布时间】:2020-05-20 00:45:54 【问题描述】:这个问题很清楚。例如,我想检查一个数字 x 是否包含在另一个数字 y 中。我想用 SQL 来做(如果可能的话也在 LINQ 中)。此外,这些整数值(y 值)是表中的 ID。因此,当涉及 LINQ 时,我不是在寻找一些通用的解决方案,例如:
int y=123,x=32;
bool isContainedInY = y.ToString().Contains(x.ToString());
例子:
x = 5, y = 1256 => true
x = 384, y = 38412 => true
x = 1, y = 5236 => false
答案可以基于如下表格:
+------+-------+
| Id | Name |
+------+-------+
| 52 | Lola |
| 65 | Dolly |
| 88 | Wolly |
| 102 | Sorry |
+------+-------+
【问题讨论】:
到目前为止你尝试了什么。有转换和字符串函数可以满足你的需要。 数字不包含其他数字,字符串包含。一个简单的LIKE '%5%'
就可以了。在 LINQ 中,String.Contains(substring)
被转换为 LIKE '%substring%'
这个问题还不清楚 - 你想做什么?这是一个非常缓慢的操作,无法通过索引来加速。它将扫描整个表以检查每个值。无论您想做什么,都可能有更好的方法来做。如果您想将数字用作一组标志,请不要。您可以使用单独的字段,小到单个字节,易于查询和索引
没有@SurajKumar 根本没有回答我的问题。我已经知道该问题中作为答案给出的所有内容。使用字符串很容易。
@GiraySekerlen 为什么?这就是您在问题本身中写的,但是为什么?您试图通过在另一个数字中搜索一个数字来解决什么真正的问题?
【参考方案1】:
您可以先将它们转换为 varchar
SELECT CHARINDEX(STR(x), STR(y)) > 0
【讨论】:
【参考方案2】:您可以使用以下内容,使用CHARINDEX
:
SELECT CASE WHEN CHARINDEX(CONVERT(VARCHAR, x), CONVERT(VARCHAR, y)) > 0 THEN 1 ELSE 0 END
-- or
SELECT CONVERT(BIT, CHARINDEX(CONVERT(VARCHAR, x), CONVERT(VARCHAR, y)))
...或使用LIKE
:
SELECT CASE WHEN CONVERT(VARCHAR, y) LIKE '%' + CONVERT(VARCHAR, x) + '%' THEN 1 ELSE 0 END
...或使用PATINDEX
:
SELECT CASE WHEN PATINDEX('%' + CONVERT(VARCHAR, x) + '%', CONVERT(VARCHAR, y)) > 0 THEN 1 ELSE 0 END
-- or
SELECT CONVERT(BIT, PATINDEX('%' + CONVERT(VARCHAR, x) + '%', CONVERT(VARCHAR, y)))
...或使用REPLACE
:
SELECT CASE WHEN REPLACE(CONVERT(VARCHAR, y), CONVERT(VARCHAR, x), '') <> y THEN 1 ELSE 0 END
您也可以create a function检查一个号码是否包含另一个号码:
CREATE FUNCTION dbo.ContainsNumber (@y INT, @x INT)
RETURNS BIT
AS
BEGIN
RETURN CONVERT(BIT, CHARINDEX(CONVERT(VARCHAR, @x), CONVERT(VARCHAR, @y)))
END
你可以这样使用函数:
SELECT dbo.ContainsNumber(y, x)
SELECT * FROM table_name WHERE dbo.ContainsNumber(y, x)
demo on dbfiddle.uk
【讨论】:
为什么不使用LIKE
?【参考方案3】:
Like
运营商将解决您的问题。但首先,您需要将 int 变量转换为字符串。
DECLARE @x INT = 5;
DECLARE @y INT = 1256;
if CONVERT(VARCHAR, @y) like '%'+CONVERT(VARCHAR, @x)+'%'
begin
select 1 as result
end
else
begin
select 0 result
end
【讨论】:
【参考方案4】:在 LINQ 中 Demo on dotnet fildde
你可以在Linq中使用Contains()
方法来实现。
private static bool CheckContain(int x, int[] array)
return array.Any(y => y.ToString().Contains(x.ToString()));
测试
var array = new [] 52, 65, 88, 102, 5 ;
Console.WriteLine(CheckContain(5, array)); // True
Console.WriteLine(CheckContain(384, array)); // False
Console.WriteLine(CheckContain(1, array )); // True
【讨论】:
感谢@Phong,但这并不是我想要的。 y 值应对应于表的 Id 值。 我刚刚更新了我的答案,请查看@Giray Sekerlen。我确定这正是您要寻找的东西 感谢@Phong!我真的很欣赏这种努力,但它确实不是我正在寻找的答案。我已经知道你声称的答案。以上是关于如何检查一个 int 是不是包含另一个 int 作为它的一部分?的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C 检查带有 int 的数组是不是包含 int [关闭]
整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift