【问题标题】:Coldfusion find if column has valueColdfusion查找列是否有值
【发布时间】:2018-11-26 06:32:45
【问题描述】:

我有一个表,其中有一列 LanguageID。它有七个值:1、2、3、4、5、6、22

现在我有一个函数可以获取当前用户的语言 ID。

我想检查我的表中是否存在该语言 ID,如果存在则返回该值,如果不存在则返回默认值 2。如果该表中不存在 2,则返回 1。

这是我的查询:

<cfquery name="NameName" datasource="mydatabase">
        SELECT DISTINCT SomeID,
        SomeName,
        LanguageID
        FROM myDatabase WITH(NOLOCK)
        WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#" />
        <cfif isDefined(arguments.LanguageID)> //I want to check if the arguments.LanguageID exists in the table
            AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.LanguageID#" />
        <cfelseif NOT isDefined(arguments.LanguageID) > //ako nema value
            AND LanguageID = 2 //default, put languageID to 2
        <cfelse>
            AND LanguageID = 1 //if languageID 2 doesn't exist in that table, then put 1
        </cfif>
    </cfquery>

所以现实生活中的例子。函数激活,LanguageID 为 3。没关系,第一次 cfif 检查表是否有值 3,它有,好的,然后将 languageID 设置为 3 并结束。

第二种情况。函数激活,LanguageID 为 44。第一个 cfif 检查表的值是否为 44,它没有该值,因此第二个 cfif 激活并将 LanguageID 设置为 2 .

【问题讨论】:

  • 你的情况是这样的,它永远不会进入 cfelse 块。 arguments.LanguageID 存在或不存在。所以要么进入第一部分,要么进入第二部分。
  • @CFML_Developer 我知道。这就是为什么我被困在这里:(
  • 如果LanguageID的默认值为2,什么情况下会是1?
  • 您真的是要检查表中是否包含LanguageID = 2 的行,如果不包含LanguageID = 1 则回退到行?
  • 您希望此查询有多少行?

标签: sql coldfusion


【解决方案1】:

这可以在 SQL 本身中完成。这可能比让 ColdFusion 尝试进行查询处理的性能要高得多。

根据您最初的问题,我做了几个假设。首先,这个查询应该只返回 1 个结果 (TOP 1)。其次,您的默认语言是2 对应Default11 对应Default2。这还包括您要搜索的值将大于 1 或 2。

SELECT TOP 1 SomeID, SomeName, LanguageID
FROM (
  SELECT SomeID, SomeName, LanguageID
  FROM t1
  WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
    AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Language#">

  UNION ALL 

  SELECT SomeID, SomeName, LanguageID
  FROM t1 
  WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
    AND LanguageID IN ( <cfqueryparam value="1,2" cfsqltype="CF_SQL_INTEGER" list="yes"> ) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;

这是有效的,因为如果过滤条件不匹配,查询将不会返回任何结果,但是当加入到有结果的查询(您的默认值)时,这些结果将出现在整个查询中。然后我对结果进行排序并获得前 1 名。

查询的基本要点在:https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877

我还提供了几个演示,说明如果找不到您的LanguageID,这是如何工作的,以及使用不是12 的默认IDs 的一种可能方式。


并将所有内容保存在一个地方:

CREATE TABLE t1 ( id int, lang varchar(10) ) ;
INSERT INTO t1 (id, lang)
VALUES (1,'Default 2'),(2,'Default 1'),(3,'Klingon')
  ,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* If you will only have one language per id, and default IDs will always be 2 and 1 */
/* Match */
SELECT TOP 1 id, lang
FROM (
  SELECT id, lang 
  FROM t1
  WHERE id = 3

  UNION ALL 

  SELECT id, lang
  FROM t1 
  WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
编号 |郎 -: | :------ 3 |克林贡语
/* No match. */
SELECT TOP 1 id, lang
FROM (
  SELECT id, lang 
  FROM t1
  WHERE id = 99999

  UNION ALL 

  SELECT id, lang
  FROM t1 
  WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
编号 |郎 -: | :-------- 2 |默认 1
/* No Default1 Language */
CREATE TABLE t2 ( id int, lang varchar(10) ) ;
INSERT INTO t2 (id, lang)
VALUES (1,'Default 2'),(3,'Klingon')
  ,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;

SELECT TOP 1 id, lang
FROM (
  SELECT id, lang 
  FROM t2
  WHERE id = 9999

  UNION ALL 

  SELECT id, lang
  FROM t2 
  WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
编号 |郎 -: | :-------- 1 |默认 2
/* No Default Language */
CREATE TABLE t3 ( id int, lang varchar(10) ) ;
INSERT INTO t3 (id, lang)
VALUES (3,'Klingon')
  ,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;

/* No match. No Default. */
SELECT TOP 1 id, lang
FROM (
  SELECT id, lang 
  FROM t3
  WHERE id = 9999

  UNION ALL 

  SELECT id, lang
  FROM t3 
  WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
编号 |郎 -: | :---
/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
  SELECT id, lang 
  FROM t3
  WHERE id = 3

  UNION ALL 

  SELECT id, lang
  FROM t3 
  WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
编号 |郎 -: | :------ 3 |克林贡语
/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
  ,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;

/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
  SELECT id, lang 
  FROM t4
  WHERE id = 9999

  UNION ALL 

  SELECT s2.id, s2.lang 
  FROM (
    SELECT TOP 1 id, lang
      , CASE 
          WHEN ID = 42 THEN 2 
          WHEN ID = 40 THEN 1 
          ELSE 0 
        END AS sortOrder
    FROM t4 
    WHERE id IN (40,42) /* NEW DEFAULT IDs */
    ORDER BY sortOrder DESC
  ) s2
) s1
ORDER BY s1.id DESC
;
编号 |郎 -: | :-------- 42 |默认 1

db小提琴here

【讨论】:

  • 我还从查询中删除了NOLOCK。请参阅我上面的评论。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
  • 卡普拉'!正是我要建议的;-)
  • @Ageax 我已经警告过你了。在我的脑海里可能是一个可怕的地方。
猜你喜欢
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
相关资源
最近更新 更多