You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询:用testtable随机值替换Cash字段NULL值

替换SQL查询结果中NULL值为随机指定表数据

现有某SQL查询返回如下结果,其中Cash字段均为NULL:

|SEDOL |   ISIN      | Cash |
=============================
|ZZZ0072|GB00B7JYLW09| null |
-----------------------------
|CASH   |GB00B7JYLW09| null |
-----------------------------
|ZZZ0072|GB00B7JYLW09| null |
-----------------------------
|ZZZ0009|GB00B7JYLW09| null |
-----------------------------

需要将Cash字段的NULL替换为testtable表中IsCash字段的任意随机值,目标结果示例如下:

|SEDOL |   ISIN      | Cash |
=============================
|ZZZ0072|GB00B7JYLW09|150146|
-----------------------------
|CASH   |GB00B7JYLW09| 182  |
-----------------------------
|ZZZ0072|GB00B7JYLW09| 1190 |
-----------------------------
|ZZZ0009|GB00B7JYLW09| 2000 |
-----------------------------

testtable表结构及数据如下:

|    IsCash  |
==============
|     36     |
--------------
|   150146   |
--------------
|    182     |
--------------
|   2000     |
--------------
|   200952   |
--------------
|   200000   |
--------------
|   350000   |
--------------
|   150000   |
--------------
|    1190    |
--------------

解决方案

根据不同数据库类型,提供两种常用实现方式:

方式1:每行随机取独立值(允许重复)

这种写法会让结果里的每行Cash都随机从testtable中选取一个IsCash值,可能出现重复。

SQL Server

SELECT 
    SEDOL,
    ISIN,
    ISNULL(Cash, (SELECT TOP 1 IsCash FROM testtable ORDER BY NEWID())) AS Cash
FROM 原查询结果表 -- 替换为你的原查询或源表名

MySQL

SELECT 
    SEDOL,
    ISIN,
    IFNULL(Cash, (SELECT IsCash FROM testtable ORDER BY RAND() LIMIT 1)) AS Cash
FROM 原查询结果表 -- 替换为你的原查询或源表名

PostgreSQL

SELECT 
    SEDOL,
    ISIN,
    COALESCE(Cash, (SELECT IsCash FROM testtable ORDER BY RANDOM() LIMIT 1)) AS Cash
FROM 原查询结果表 -- 替换为你的原查询或源表名

方式2:匹配不重复随机值(需源表行数≤testtable行数)

如果希望每行取不同的IsCash值(前提是原结果表行数不超过testtable的行数),可以通过随机行号关联实现:

SQL Server

SELECT 
    t.SEDOL,
    t.ISIN,
    ISNULL(t.Cash, tt.IsCash) AS Cash
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS rn
    FROM 原查询结果表 -- 替换为你的原查询或源表名
) t
CROSS APPLY (
    SELECT IsCash, ROW_NUMBER() OVER (ORDER BY NEWID()) AS rn
    FROM testtable
) tt
WHERE t.rn = tt.rn

MySQL

SELECT 
    t.SEDOL,
    t.ISIN,
    IFNULL(t.Cash, tt.IsCash) AS Cash
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY RAND()) AS rn
    FROM 原查询结果表 -- 替换为你的原查询或源表名
) t
JOIN (
    SELECT IsCash, ROW_NUMBER() OVER (ORDER BY RAND()) AS rn
    FROM testtable
) tt ON t.rn = tt.rn

PostgreSQL

SELECT 
    t.SEDOL,
    t.ISIN,
    COALESCE(t.Cash, tt.IsCash) AS Cash
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY RANDOM()) AS rn
    FROM 原查询结果表 -- 替换为你的原查询或源表名
) t
JOIN (
    SELECT IsCash, ROW_NUMBER() OVER (ORDER BY RANDOM()) AS rn
    FROM testtable
) tt ON t.rn = tt.rn

内容的提问来源于stack exchange,提问作者Patterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:53:12