【问题标题】: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 为什么?这就是您在问题本身中写的,但是为什么?您试图通过在另一个数字中搜索一个数字来解决什么真正的问题?

标签: sql sql-server


【解决方案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!我真的很欣赏这种努力,但它确实不是我正在寻找的答案。我已经知道你声称的答案。
      猜你喜欢
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多