我在t-sql中有一个查询,它检查表中是否存在column,如果它确实用where子句中的列查询表,如果不存在,那么查询就不同了。
1.还有比这更好的解决方案吗?
1.在Oracle PL/SQL中是否可以重新创建此功能?
--check if dbo.table.UPDATE_STAMP exists
IF COL_LENGTH('dbo.table', 'UPDATE_STAMP') IS NULL
BEGIN
--if dbo.table.UPDATE_STAMP does not exist
SELECT * FROM dbo.table where CREATE_STAMP > GETDATE()
END
ELSE
BEGIN
--if dbo.table.UPDATE_STAMP does exist
EXEC('SELECT * FROM dbo.table WHERE UPDATE_STAMP > GETDATE()')
END
字符串
1条答案
按热度按时间pwuypxnk1#
免责声明
这种设计不是很自然(至少在Oracle中是这样),因为您要么在数据模型中有列,并且可以硬编码它,知道它在模型定义中扮演什么角色,要么您没有列,并且您不能保证如果几年后有人添加它,它的含义也是一样的。为了便于维护,最好是让代码静态化,并在模型发生变化时对其进行更改,而不是让动态SQL自动适应变化。
答案
您可以使用SQL宏(自版本19.7起可用)。
如果你不想为每个表创建一个函数,那么你可以在
with function
块中本地声明这个函数,但是同一个查询应该总是返回相同的表形状,所以如果你在同一个会话中添加/删除列并再次执行查询(或者你必须指定列列表而不使用*
),这可能是一个问题。设置:
字符串
查询1:
型
| 瓦尔| VAL |
| --| ------------ |
| 001| 001 |
| 002| 002 |
然后删除该列并重新执行查询:
x
的一个或多个字符
| 瓦尔| VAL |
| --| ------------ |
| 001| 001 |
| 002| 002 |
| 零零三| 003 |
| 零零四| 004 |
| 005| 005 |
fiddle