如何检查一个 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 作为它的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是包含int? -迅速

Objective-C 检查带有 int 的数组是不是包含 int [关闭]

整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift

Java,简化检查 int 数组是不是包含 int

如何连接2个数组:1个数组包含字符串,另一个数组包含int64

检查 varchar() 是不是为 int [重复]