AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 22175
Accepted
joe
joe
Asked: 2012-08-09 07:06:17 +0800 CST2012-08-09 07:06:17 +0800 CST 2012-08-09 07:06:17 +0800 CST

CHARINDEX OR IN 等价于整数

  • 772

我想要与此等效的整数。

--Valid SQL
DECLARE @users AS nvarchar(50)
SET @users = 'Joe ,Bob,Fred,Tim' --1,2,8,23
select * FROM Person AS p
WHERE CHARINDEX(p.sFullName,@users) > 0

所以像这样。

--Invalid SQL
DECLARE @users AS nvarchar(50)
SET @users = '1,2,8,23'
select * FROM Person AS p
WHERE p.ixPerson IN(@users
sql-server t-sql
  • 6 6 个回答
  • 1695 Views

6 个回答

  • Voted
  1. Best Answer
    Cade Roux
    2012-08-10T09:45:59+08:002012-08-10T09:45:59+08:00

    您还没有真正指出如何调用它。您是否真的有一个充满逗号分隔的整数的字符串,或者这只是系统其他方面的产物?

    如果围绕此要求的外部环境是可变的,那么通常在 SQL Server 2008 及更高版本中,我传递一个包含 ID 列表(可能来自 ADO.NET 或其他)的表值参数,然后将其用作过程中的表 - 即WHERE value IN (SELECT id FROM @table)或INNER JOIN @table AS t ON t.id = users.t

    • 4
  2. swasheck
    2012-08-10T09:22:35+08:002012-08-10T09:22:35+08:00

    选项 1(第一部分直接来自Adam Machanic 的博客)

    DECLARE @number_of_numbers INT = 100000;
    ;WITH
    a AS (SELECT 1 AS i UNION ALL SELECT 1),
    b AS (SELECT 1 AS i FROM a AS x, a AS y),
    c AS (SELECT 1 AS i FROM b AS x, b AS y),
    d AS (SELECT 1 AS i FROM c AS x, c AS y),
    e AS (SELECT 1 AS i FROM d AS x, d AS y),
    f AS (SELECT 1 AS i FROM e AS x, e AS y),
    numbers AS
    (
    SELECT TOP(@number_of_numbers)
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS number
    FROM f
    )
    SELECT [your],[required],[columns],[here]
    FROM Person where Person.ixPerson in (select number from numbers);
    

    当然,这只是创建数字表的一种方法。如果您正在寻找随机分类的 id,您可以使用表格变量或其他东西快速填充数字表格。但是,您必须将代码中的列表或使用 billinkc 建议的 UDF 分开,此时构建该IN子句可能会更好。

    选项 2(在此处使用@CadeRoux 的答案):

    CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
    RETURNS table
    AS
    RETURN (
        WITH Pieces(pn, start, stop) AS (
          SELECT 1, 1, CHARINDEX(@sep, @s)
          UNION ALL
          SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
          FROM Pieces
          WHERE stop > 0
        )
        SELECT pn,
          SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
        FROM Pieces
      );
    
    declare @nums nvarchar(100);
    set @nums = N'1,2,5,10,87';
    SELECT [your],[required],[columns],[here]
        FROM Person where Person.ixPerson in (select CAST(s AS INTEGER) s from dbo.Split(N',',@nums));
    
    • 3
  3. billinkc
    2012-08-09T07:24:04+08:002012-08-09T07:24:04+08:00

    我会看一个数字表类型的解决方案,将分隔的数据拆分成可以使用的东西https://stackoverflow.com/questions/8956671/how-to-convert-varchar-to-integer-in-sql-server -stored-procedure/8958460#8958460然后你可以使用IN子句就好了

    • 1
  4. Cade Roux
    2012-08-10T09:55:16+08:002012-08-10T09:55:16+08:00

    我希望这个简单的解决方案在许多情况下都可以正常工作,尽管它并不能特别扩展(但您的问题中的示例也没有使用 CHARINDEX):

    DECLARE @users AS nvarchar(50)
    SET @users = '1,2,8,23'
    SELECT *
    FROM Person AS p
    WHERE ',' + @users + ',' LIKE '%,' + CAST(VARCHAR(10), p.ixPerson) + ',%'
    
    • 1
  5. joe
    2012-08-10T09:09:28+08:002012-08-10T09:09:28+08:00

    我不喜欢这个解决方案,但这就是我所做的。

    DECLARE @users AS nvarchar(MAX)
    SET @users = ('8,10,28')
    
    DECLARE @finalCommand AS NVARCHAR(MAX)
    SET @finalCommand = 'SELECT p.sFullName, *
                     FROM   Person as p
                     WHERE  p.ixPerson IN (' +  @users + ')'
    
    EXEC sp_executesql  @finalCommand 
    
    • 0
  6. Gordon Bell
    2012-08-10T12:35:09+08:002012-08-10T12:35:09+08:00
    DECLARE @IDs AS nvarchar(50);
    SET @IDs = N'1,2,8,23';
    
    SELECT p.*
    FROM dbo.Person AS p
    WHERE CHARINDEX(N',' + CONVERT(nvarchar(11), p.ID) + N',', N',' + @IDs + N',') > 0;
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve