【问题标题】:Replacing string in sql query替换sql查询中的字符串
【发布时间】:2014-07-03 09:45:35
【问题描述】:

这就是我检索数据的方式

select myPlan from myTable

这是结果,

        myPlan
=====================
True  , False , True
False , True  , False
False , True  , True

在每一行中,我有三个用逗号分隔的布尔值。
第一个布尔值代表早餐,第二个是午餐,最后一个是晚餐。

我只想将结果替换为

        myPlan
=====================
BreakFast , Dinner
Lunch
Lunch , Dinner

我可以只使用 sql query 进行替换吗? 我正在使用SQL server 2008 R2

【问题讨论】:

  • 您使用的是哪个数据库系统?
  • 如果你有一个规范化的数据库,它有 3 个不同的布尔列而不是一个复杂的 CHAR 列,那会简单得多;)
  • @Frazz :) 。我完全同意 。下次我将遵守该数据库规范化。谢谢!

标签: sql string sql-server-2008 replace


【解决方案1】:

由于您只有 3 个布尔值,您可以对所有 8 种可能性使用 case 语句。

SELECT
    (CASE
    WHEN myPlan = 'True , True , True'
    THEN 'Breakfast, Lunch, Dinner'
    WHEN myPlan = 'True , True , False'
    THEN 'Breakfast, Lunch'
    WHEN myPlan = 'True , False , False'
    THEN 'Breakfast'
    WHEN myPlan = 'True , False , True'
    THEN 'Breakfast, Dinner'
    WHEN myPlan = 'False , False , True'
    THEN 'Dinner'
    WHEN myPlan = 'False , True , True'
    THEN 'Lunch, Dinner'
    WHEN myPlan = 'False , True , False'
    THEN 'Lunch'
    ELSE ''
    END) myPlan
FROM myTable

【讨论】:

  • +1 因为考虑到桌子的设计,这似乎很合理!
  • +1 但您可能应该添加 3xFalse 的第 9 个选项
  • @Szymon 3xFalse 被ELSE ''覆盖
  • 唯一的问题是空格格式很重要,但话又说回来 - 设计不是.....“最佳”开始:)所以我会适当地替换空格和逗号与空然后小写所有所以你得到第一个案例的'truetruetrue'字符串
  • @AllanS.Hansen ,我已经使用 Replace(myPlan, ' ', '') 删除了空格。无论如何,FuzzyTree 的答案完美无缺。 :)
【解决方案2】:

您可以按如下方式使用字符串函数。

DECLARE @TEMP AS TABLE(MyPlan VARCHAR(100))

INSERT INTO @TEMP(MyPlan) VALUES ('True  , False , True')
INSERT INTO @TEMP(MyPlan) VALUES ('False , True  , False')
INSERT INTO @TEMP(MyPlan) VALUES ('False , True  , True')

SELECT

     CASE 
        WHEN RTRIM(SUBSTRING(MyPlan,1,5)) = 'TRUE' THEN 'BREAKFAST'
        ELSE '' 
    END 
    +CASE 
        WHEN RTRIM(SUBSTRING(MyPlan,9,5)) = 'TRUE' THEN ',LUNCH'
        ELSE '' 
    END 
    +CASE 
        WHEN RTRIM(SUBSTRING(MyPlan,17,5)) = 'TRUE' THEN ',DINNER'
        ELSE '' 
    END 

FROM @TEMP

【讨论】:

    【解决方案3】:

    更短的解决方案:

    select 
    decode(substr(myPlan,0,1),'T','Breakfast',null) ||  decode(substr(myPlan,0,1),'T',' , ',null) ||
    decode(substr(myPlan,9,1),'T','Lunch',null) ||  decode(substr(myPlan,9,1),'T',' , ',null) ||
    decode(substr(myPlan,17,1),'T','Dinner',null) 
    from mytable;
    

    【讨论】:

    • OP 使用 MS SQL2008。 decode 是一个 Oracle 函数。 (在 MS SQL 中,substr 是 SUBSTRING
    猜你喜欢
    • 2023-02-23
    • 1970-01-01
    • 2020-06-09
    • 2011-10-05
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多